所以,我有这个项目,我在其中使用 yapsy 和 watchdog,但是这两个库在 PyPI 上都有损坏的版本(至少对于 p3,我所说的“损坏”只是以错误的方式移植)。
我没有从 PyPI 安装它们,而是克隆了它们的 GIT 存储库并手动安装了它们。当我开始编写 setup.py 时出现了问题。
如何告诉安装应用程序(pip、easy_install 等)使用来自 VCS 存储库的版本,而不是 PyPI?
我可以通过 fork 和修复这些库来做到这一点,但我发现它……错了。我将不得不卡住库,或者等待一段时间,直到有人将我的修复合并到 libs 存储库。
请您参考如下方法:
在您使用此解决方案之前
我强烈建议阅读问题和答案的评论 - 这个解决方案很脏,应该只在别无选择时使用(因为公司政策,或其他任何你不能改变的)。
解决方案
我发现的第一件事是我需要使用依赖链接。当 repo 版本高于 PyPI 时,它很有用。问题是,当版本相同时,安装应用程序更喜欢 PyPI 而不是 VCS。
所以,多亏了这个:Setuptools unable to use link from dependency_links我发现我需要告诉安装应用程序 VCS 拥有比 PyPI 更高的版本,即使它们是相同的,并且需要版本小于或等于这个更高的版本(我声明在 VCS 上)。
所以,是的,很酷。我可以写:
...
install_requires=[ ..., "watchdog<0.6.1", ...],
...
dependency_links = [
...
"git+https://github.com/gorakhargosh/watchdog.git#egg=watchdog",
...
], ...
但是如果明天有新版本发布,那么我会留下最新的错误修复等。
所以我想通了,我现在需要找出最高版本,然后用“最后位置高一点”的版本来解决问题。这是我用于此的代码。我把它放在“setup_helpers.py”中:http://pastebin.com/1crW5VCL
现在,在 setup.py 中我做了类似的事情:
from setup_helpers import vcs_requirement, egg_name
...
install_requires=[ ..., vcs_requirement("watchdog"), ...],
...
dependency_links = [
...
"git+https://github.com/gorakhargosh/watchdog.git#egg=%s" % egg_name("watchdog"),
...
], ...
这就是诀窍 - 只要没有人会弄乱版本号(所以它们严格保持数字,没有分支等等)。此外,这强制假设 VCS 代码比 PyPI 代码更新。它对我有用。
