Python包可以依赖于另一个包的特定版本控制修订吗?
有些有用的Python包在pypi上出现了问题,只有特定的版本在版本控制系统中是可以接受的。我们能不能在 setup.py
文件中这样表示呢,比如:
requires = 'svn://example.org/useful.package/trunk@1234'
?
4 个回答
我还没弄明白怎么在 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)
如果你真的需要一个很少见的包的特定版本,而且没有办法使用其他版本的话,你可以考虑把这个版本的包和你自己的一起发布。如果有必要,可以把它放在你自己的命名空间里,这样可以确保使用的是你这个版本。
你需要做两件事。首先,明确你想要的确切版本,比如:
install_requires = "useful.package==1.9dev-r1234"
然后,你需要添加一个 dependency_links
设置,告诉系统在哪里可以找到这个版本:
dependency_links = ["svn://example.org/useful.package/trunk@1234#egg=useful.package-1.9dev-r1234"]
注意,dependency_links
URL 中的 #egg=
部分必须和你在 install_requires
中指定的内容完全一致;这两者是通过这个部分连接起来的。
发生的事情是,setuptools 会看到链接中的 #egg 标签,并把这个 URL 保存为该特定版本包的可下载链接。然后,当它稍后需要这个依赖时,就会下载这个确切的 SVN URL。
不过,要让这个方法真正有效,目标 SVN 版本必须真的生成一个与该名称和版本相符的 egg 文件。否则,你的依赖在运行时会失败!所以,这个方法只有在你依赖的包使用 SVN 版本标签作为默认构建版本号时才有效。