Использование пользовательских пакетов в моем проекте Python - PullRequest
5 голосов
/ 01 ноября 2010

Я сейчас делаю несколько проектов на python и пытаюсь понять, как работать с моими собственными версиями существующих пакетов с открытым исходным кодом.

Например, я использую tipfyс zc.buildout, и я добавил в пакет «PayPal».К сожалению, у него нет нужной мне функции, поэтому я добавил ее на github и добавил.Я отправлю сопровождающему пакет оригинального запроса на поддержку, но независимо от того, принимают ли они мои дополнения или нет, я бы хотел использовать свою версию пакета и сохранить удобство управления zc.buildout своими зависимостями.Как мне это сделать?

Могу ли я загрузить свой собственный вариант библиотеки в PyPI и добавить к нему мое имя?Разве это не излишне загрязнит индекс?

Или я должен создать и поддерживать свой собственный индекс и репо пакетов?Где я могу найти формат для этого?И не противоречит ли условиям лицензий OSS размещение моего собственного репо с модифицированными пакетами с такими же именами?(Я бы предпочел не изменять каждый файл в проекте новыми пространствами имен)

Я уверен, что эта проблема возникает довольно часто, и не только с python.Я также вижу, что это происходит с Maven и SBT ... что обычно делают люди, когда хотят использовать свои собственные версии популярных пакетов?

Ответы [ 6 ]

5 голосов
/ 01 ноября 2010

Есть два способа сделать это.Я использую оба, в зависимости от контекста, для которого используется сборка:

  1. Использование mr.developer для включения пакетов из системы контроля версий (поддержка mr.developerширокий спектр систем, включая git).Я использую это при разработке.

  2. Создание личного репозитория пакетов.Достаточно простого списка каталогов в Apache.Добавьте URL-адрес в свой личный репозиторий в виде записи find-links:

    [buildout]
    ...
    find-links =
        ...
        http://username:password@dist.example.com/projectname
    

    В этом примере я также включил имя пользователя и пароль (buildout затем будет аутентифицироваться) и путь на сервере, который зависит от проекта.Конечно, вы также можете просто создать один большой частный репозиторий для всех своих проектов.

    В этот репозиторий вы либо кладете полные яйца, либо просто архив из пакета.Репозитории с именами в find-links ищутся до PyPI.

    Я использую этот метод для компоновок развертывания.Таким образом, программное обеспечение будет использовать выпущенные пакеты, что делает управление выпуском намного понятнее и проще.

Размещение собственных форков пакетов OSS - это прекрасно!Это одна из свобод, которую вы получаете при использовании OSS.Обратите внимание, что когда вы разветвляете GPL-код, подобный этому, и распространяете его третьему лицу, вам необходимо предоставить им свои изменения.Хранилище пакетов - это один из способов выполнить это.

2 голосов
/ 01 ноября 2010

Чтобы держать вашу головную боль под контролем, я действительно рекомендовал бы просто связать весь такой пользовательский код с вашим пакетом.Скажем, вы сделали вилку из какого-то package.Пока его лицензия позволяет, я бы просто связал измененную версию package с моим кодом, как будто это просто еще один каталог.Вы можете разместить его локально под package, чтобы его было легко найти.Как только разработчики package исправят то, что вам нужно, просто удалите этот каталог и снова сделайте его зависимым от онлайн-пакета.

Дополнительный бонус этого подхода облегчает распространение среди пользователей / клиентов.

1 голос
/ 01 ноября 2010

Прошло много времени с тех пор, как я использовал buildout, но, если я правильно помню, есть рецепт пипса, который позволяет вам использовать файлы требований пипса. Вы можете создать файл требований, который содержит что-то вроде этого:

-e git+http://<github url>

Это будет проверять пакет локально при установке.

0 голосов
/ 30 сентября 2017

Имеет смысл иметь свой собственный PyPI-сервер для собственных, частных, разветвленных или разрабатываемых пакетов.

Например, pypiserver - это легкий и простой в настройке.

0 голосов
/ 01 ноября 2010

Могу ли я загрузить свой собственный экземпляр библиотеки в PyPI и добавить в него префикс моего имени?

номер

Разве это не излишне загрязнит индекс?

Очевидно. (Кроме того, вы предполагаете, что ваше расширение действительно полезно для других. Возможно, оно не будет таким уж полезным для кого-либо, кроме вас. Действительно, ваше расширение может указывать на то, что пакет не понимает.)

Или я должен создать и поддерживать свой собственный индекс и репо пакетов?

Никогда. Это совершенно глупо. У вас есть модифицированный пакет. Вам не нужен репозиторий, если вы не собираетесь завершать работу с PyPI. Вы можете попробовать, но зачем?


Вот что вы делаете.

простираться

Вы можете легко расширить данный пакет без изменения или разветвления.

my_paypal.py

from paypal import *

class MyFancyExtension( SomeExistingClass ):
    def override( self, ... )

def my_other_extension( ... ):
    this()
    that()

Это довольно просто. Это часто лучше, чем разветвление, потому что вы сохраняете оригинальный пакет без изменений вашими расширениями.

0 голосов
/ 01 ноября 2010

Любые пути, которые вы указали в dependency_links в setup.py вашего проекта, будут сначала найдены. Так что просто поместите ваш пакет в путь и установите dependency_links на этот путь.

local_packages = ['file:///path/to/packages']

setup(
 ...
 dependency_links=local_packages,
...)

Setuptool документы охватывают немного больше о том, как все это работает, но это действительно все, что нужно сделать.

Edit: zc.buildout по умолчанию использует setuptools dependency_links var. Если вы хотите выключить его .

...