2010-01-18 4 views
9

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

requires = 'svn://example.org/useful.package/[email protected]'?

ответ

12

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

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

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

dependency_links = ["svn://example.org/useful.package/[email protected]#egg=useful.package-1.9dev-r1234"] 

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

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

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

+1

Да, это не/действительно/работает в общем случае ... Я просто использую pip сейчас. – joeforker

+0

не должен «find_links» на самом деле быть «dependency_links»? –

+0

Спасибо, Габриэль. Я исправил это. –

2

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

1

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

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

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

2

Я не понял, как ссылаться на это от 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/[email protected]#egg=WebOb 
-e svn+http://svn.sqlalchemy.org/sqlalchemy/[email protected]#egg=SQLAlchemy 
-e svn+http://svn.zope.org/repos/main/z3c.saconfig/[email protected]#egg=z3c.saconfig 
## The following requirements were added by pip --freeze: 
APScheduler==1.01 
simplejson==2.0.9 
... (many more) 
+0

Вы действительно хотите иметь редактируемую форму ваших зависимостей? –

+0

Иногда я это делаю. – joeforker