【问题标题】:Force setuptools to require package from repository instead of PyPI强制 setuptools 要求来自存储库而不是 PyPI 的包
【发布时间】:2014-01-25 03:54:42
【问题描述】:

所以,我有这个项目,我在其中使用 yapsy 和 watchdog,但是这两个库在 PyPI 上都有损坏的版本(至少对于 p3,我所谓的“损坏”只是以错误的方式移植)。

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

我如何告诉安装应用程序(pip、easy_install 等)使用 VCS 存储库中的版本,而不是 PyPI?

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

【问题讨论】:

  • 总而言之:如果您在setup.py 中指定如何安装依赖项,那么您将自己与这些依赖项联系得太紧密了。每次依赖项之一如何切换下载位置时,您都需要升级自己的版本号。请改为在项目文档中提供 requirements.txtbuildout.cfg 或手动说明。
  • 请参阅 caremad.io/blog/setup-vs-requirement 了解有关该主题的优秀博文。

标签: python python-3.x setuptools


【解决方案1】:

使用此解决方案之前

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

解决方案

我发现的第一件事是我需要使用依赖链接。当 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 代码更新。它对我有用。

【讨论】:

  • 你的包裹真的不应该做出这样的决定。包裹的分布很容易随着时间的推移而改变,不要将您的包裹绑定到特定的位置。
  • 取决于版本范围,并留下查找包直到 pipbuildout 或您用于安装包的任何工具。可以指示他们查看 GitHub 的依赖项。
  • 那么,在这种情况下你有什么建议呢?我了解为什么创建 PyPI,并且可能会移动存储库等 - 但这是 PyPI 未正确使用的情况,我别无选择,只能从 VCS 存储库安装它。当然,如果出现修复,我将更改我的 setup.py 以再次使用 PyPI。
  • 如果您需要更改您的 setup.py 只是因为外部依赖项发生了更改,您还需要更改您的版本号,否则您的包将无法正确重新安装。不要乱用setup.py,除非你的自己的代码改变了。d
  • 查看codeinthehole.com/writing/… 获取点子示例。
猜你喜欢
  • 2012-10-29
  • 2016-12-26
  • 2019-11-26
  • 1970-01-01
  • 2020-09-28
  • 2021-07-09
  • 2017-07-03
  • 1970-01-01
  • 2013-06-13
相关资源
最近更新 更多