在 install_requires 中使用 git 回购写入 setup.py 以检测已安装

Write setup.py using git repo in install_requires to detect already installed

我有一个依赖 git+ssh 的包,如下所示:

setup(
    name="setuprequires",
    version="0.1",
    packages=["setuprequires"],
    install_requires=[
        r"hello-world @ git+ssh://git@github.com/hello/hello-world.git#egg=hello-world"
    ],  
)

(我正在关注关于 git 回购依赖项的最新答案 。)

但是,如果我的当前环境中已经安装了 hello-world,我想跳过安装。然而,如果我 运行 pip install -e . 两次,第二次仍然会克隆 hello-world。相反,如果我刚刚使用 install_requires=[r"hello-world"],它会正确检测到这个要求已经得到满足。

在我看来 git+ssh 不能很好地检测已经满足的需求。我认为 #egg=hello-world 会解决这个问题。我错过了什么吗?

要检测存储库是最新的(或使用了某个提交),您需要先克隆它,因此即使它试图从缓存中获取缓存,您仍然首先需要存在缓存克隆它。

第一次克隆后,应该将其与现有的克隆存储库进行比较。

由于您没有指定任何提交,我猜它仍然因此而拉动。参见 Git._should_fetch() class 方法。

相反,尝试指定要使用的 commit/tag,as mentioned in the docs,它应该开始缓存:

git+https://git.example.com/MyProject.git@<hash>#egg=MyProject
git+https://git.example.com/MyProject.git@<tag>#egg=MyProject
git+ssh://git.example.com/MyProject.git@<hash>#egg=MyProject
git+ssh://git.example.com/MyProject.git@<tag>#egg=MyProject

编辑:

我注意到,如果您使用分支,缓存就会被破坏。它不是 refs/...,所以它不是显式的远程分支拉取,也不是哈希。然而,对于提交哈希,它可以完美地工作并将创建的轮子存储在 --cache-dir 目的地,然后在 pip install 命令的第二次+执行时选择该目的地。 (bug created)

示例:

from setuptools import setup

setup(
    name="testing-git",
    install_requires=[
        # cached properly
        "requests @ git+ssh://git@github.com/psf/requests.git@cd4762d5a3b56d8933d1d9c1dff365fc5db4c768#egg=requests-3.0"
        # not cached
        # "requests @ git+ssh://git@github.com/psf/requests.git@3.0#egg=requests-3.0"
    ]
)