强制setuptools要求来自存储库而不是PyPI的包

时间:2014-01-07 12:49:28

标签: python python-3.x setuptools

所以,我有这个项目,我使用yapsy和看门狗,但这两个库都在PyPI上打破了版本(至少对于p3,我称之为“已损坏”只是以错误的方式移植)。

我没有从PyPI安装它们,而是克隆了他们的GIT存储库并手动安装它们。当我开始编写setup.py时出现问题。

如何安装应用程序(pip,easy_install等)以使用VCS repo中的版本而不是PyPI?

我可以通过分叉和修复这些库来做到这一点,但我发现它......错了。我必须冻结库,或者等一段时间,直到有人将我的修复程序合并到libs存储库。

1 个答案:

答案 0 :(得分:1)

使用此解决方案之前

我强烈建议您阅读评论和回答 - 这个解决方案很脏,应该只在没有其他选择时使用(因为公司政策,或者其他任何你无法改变的事情)。

<强>解决方案

我发现的第一件事是我需要使用依赖链接。当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",
    ...
], ...

但如果tommorow新版本问世,那么我会留下最新的错误修复等等。

所以我想通了,我现在需要找出最高版本,然后使用版本“在最后一个位置上高一点”。这是我用于此的代码。我把它放在“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代码更新。它对我有用。