pip 意外没有安装带有分支/提交固定的最新版本的 git 包
Posted
技术标签:
【中文标题】pip 意外没有安装带有分支/提交固定的最新版本的 git 包【英文标题】:pip unexpectedly not installing latest version of git package with branch/commit pinning 【发布时间】:2015-07-18 05:50:23 【问题描述】:我有一个 requirements.txt 文件,其中包含以下行(以及其他内容):
git+https://github.com/lead-ratings/sexmachine.git@master#egg=SexMachine
当我这样做时
pip install -r requirements.txt
我明白了
Requirement already satisfied (use --upgrade to upgrade): SexMachine from git+https://github.com/lead-ratings/sexmachine.git@master#egg=SexMachine in /home/myuser/virtual_env/lib/python2.7/site-packages (from -r requirements.txt (line 38))
并且包没有更新到主版本。实际上,它保留了我之前在 requirements.txt
中列出的 PyPI 的一些旧版本。
如果我在固定中指定提交或使用--no-cache-dir
标志,它也不起作用。我正在使用 pip 6.1.1。
如果我使用 --upgrade
标志,那么它可以工作。但是,钉扎的意义何在?如果确实没有,为什么会说“要求已经满足”?
【问题讨论】:
【参考方案1】:Pip 仅根据版本号(在 setup.py 中)决定是否满足要求。在您的情况下,您之前安装的 pypi 版本与 sexmachine 的主分支具有相同的版本号,所以 pip 什么也没做。
似乎处理这个问题的方法是始终传递-U
/ --upgrade
标志:
pip install -r requirements.txt -U
维护者的位置在#2835中给出:
这里 pip 的行为是正确的,我们无法确定来自包内部的项目/文件的版本号。如果他们想支持可独立识别的任意标签,他们应该让他们的 setup.py 基于此进行自我调整。
【讨论】:
但是 requirements.txt 中的分支/提交部分有什么意义呢?有人会认为 pip 正在使用指定的修订版。这真的很令人困惑。我为此打开了github.com/pypa/pip/issues/2837。 Pip 克隆分支/提交,然后查看它的 setup.py 中指定的版本号。我同意这种行为令人困惑,但在考虑了一段时间后,我倾向于同意维护者的观点。如果这是您想要的行为,那么指定-U
确实没有什么害处,如果 vcs 要求具有相同的行为(始终更新),无论是否通过了 -U
标志,这都会有点奇怪。
但是如果我已经安装了,比如说scikit-learn==0.15
,然后把requirements.txt改成scikit-learn==0.16.1
,运行pip install -r requirements.txt
,新版本就下载安装好了。混淆来自于将@rev
视为不是固定的。我认为这应该记录下来,因为它会导致很多错误。
同意。我已经使用这个功能很长时间了,直到遇到一个问题,迫使我阅读源代码并发现我一直误解了它是如何工作的。【参考方案2】:
在我的情况下,即使 -U
或 --upgrade
也不起作用。 Pip 还需要 setup.py 中的版本不同才能安装新版本。通过更新 setup.py 中的包版本,它可以工作。
【讨论】:
【参考方案3】:当我为 GitHub 上固定到特定提交的包创建带有 pip
安装的 conda 环境时,我遇到了类似的问题。然后我想用pip
将它固定到另一个提交来更新这个包。 -U
标志没有帮助。但是,--force-reinstall
标记确实如此。
【讨论】:
以上是关于pip 意外没有安装带有分支/提交固定的最新版本的 git 包的主要内容,如果未能解决你的问题,请参考以下文章