Может ли пакет Python зависеть от конкретной версии контроля версий другого пакета Python? - PullRequest
10 голосов
/ 18 января 2010

Некоторые полезные пакеты Python разбиты на pypi, и единственной приемлемой версией является конкретная версия в системе контроля версий. Может ли это быть выражено в setup.py например

requires = 'svn://example.org/useful.package/trunk@1234'?

Ответы [ 4 ]

12 голосов
/ 29 января 2010

Вам нужно сделать две вещи.Во-первых, требуется точная версия, которую вы хотите, например:

install_requires = "useful.package==1.9dev-r1234"

, а затем включите параметр dependency_links, указывающий, где его найти:

dependency_links = ["svn://example.org/useful.package/trunk@1234#egg=useful.package-1.9dev-r1234"]

Обратите внимание, что версия #egg=часть URL dependency_links должна точно соответствовать тому, что вы указали в install_requires;это то, что связывает две части вместе.

Что происходит, так это то, что setuptools видит тег #egg в ссылке и сохраняет URL-адрес как доступный URL-адрес для загрузки для этой точной версии пакета.Затем, когда он попытается выполнить это требование позже, он должен загрузить этот точный URL-адрес SVN.

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

2 голосов
/ 27 января 2010

Я не понял, как ссылаться на это из setup.py, но pip может проверить конкретные версии пакетов Python с помощью простого файла требований.С файлом требований под названием requires.txt, pip install -r requires.txt установит все пакеты, перечисленные в этом файле (и их зависимости).

Вот часть моего файла требований.Строки, начинающиеся с -e, проверяют конкретные версии пакетов из системы контроля версий (git, svn или mercurial), включая мой проект, и устанавливают их в редактируемой форме.pip freeze перечисляет все установленные пакеты в этом формате.

requires.txt:

-e hg+file:///home/me/my-private-project#egg=myproject
-e hg+http://bitbucket.org/ianb/webob@tip#egg=WebOb
-e svn+http://svn.sqlalchemy.org/sqlalchemy/trunk@6638#egg=SQLAlchemy
-e svn+http://svn.zope.org/repos/main/z3c.saconfig/trunk@106508#egg=z3c.saconfig
## The following requirements were added by pip --freeze:
APScheduler==1.01
simplejson==2.0.9
... (many more)
2 голосов
/ 18 января 2010

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

1 голос
/ 18 января 2010

Вы можете выпускать пакеты определенных версий, но вы должны распространять их вместе. Нет возможности автоматически загрузить их со стандартным Python.

Однако вы можете использовать Buildout и создать buildout.cfg, который позволяет реплицировать среду. Он может проверить и установить определенные ревизии, если вы используете такие расширения, как mr.developer.

http://pypi.python.org/pypi/zc.buildout http://pypi.python.org/pypi/mr.developer

...