【问题标题】:pip3 setup.py install_requires PEP 508 git URL for private repopip3 setup.py install_requires PEP 508 git URL 用于私人仓库
【发布时间】:2019-03-27 20:27:33
【问题描述】:

我正在尝试运行:

pip3 install -e .

在我的 Python 项目中,我有以下 setup.py:

from setuptools import setup

setup(
    name='mypackage',
    install_requires=[
        "anotherpackage@git+git@bitbucket.org:myorg/anotherpackage.git"
    ]
)

但它失败了:

error in mypackage setup command: 'install_requires' must be a string or list of strings containing valid project/version requirement specifiers; Invalid URL given

我猜我的 URL 格式是正确的,因为 PEP 508 不允许为 ssh 克隆 URL 指定 git 用户名。

对于私有 git 存储库(在本例中托管在 BitBucket)的 install_requires 依赖项,使用 git+ssh 协议的 PEP 508 URL 的正确语法是什么?指定特定分支、标签或 sha 的语法是什么?

更多上下文以避免 XY 问题

我有一个内部 Python 项目,它依赖于多个内部开发的 Python 包。我想避免在组织中托管我自己的 PIP 存储库的必要性,因此我尝试直接使用 git URL。我需要对 git URL 使用 ssh 协议,因为所有用户都配置了他们的 ssh 密钥,并且要求所有用户在 BitBuckets 中配置他们的应用程序密码会很麻烦(我需要 2FA 并且常规用户密码不起作用) .

我已经尝试过使用:

dependency_links

setup(
    name='mypackage',
    install_requires=[
        "anotherpackage==0.0.1"
    ],
    dependency_links=[
        "git+git@bitbucket.org:myorg/anotherpackage.git@0.0.1#egg=anotherpackage-0.0.1"
    ]
)

但它们已被弃用并且被pip3 install -e . 忽略。根据我找到的文档,应该改用 PEP 508 URL。

requirements.txt 文件中的条目与 install_requires 条目重复

我有一个requirements.txt 文件:

-e git+git@bitbucket.org:myorg/anotherpackage.git@0.0.1#egg=anotherpackage

我使用pip3 install -r requirements.txt 而不是pip3 install -e .。它可以工作,但不是最理想的,因为我必须保持 setyp.pyrequirements.txt 同步。

如果我的问题有任何其他推荐的解决方案,我想了解它:)

【问题讨论】:

  • 我对 Python 打包不是很熟悉,但对 Git 很熟悉。您完全确定您的 URL 中的 git+git@bitbucket.org 部分吗?我希望@://,表示协议:git+git://bitbucket.org/...(我也对anotherpackage@ 前缀感到困惑,但现在我假设它来自 PEP 508,即使我快速浏览无法在 PEP 本身中找到明确的解释。)
  • 谢谢,是的,我知道根据 PEP508 应该是 ://,我试过了,但它也失败了。无论如何,我深入研究了 pip 源代码并弄清楚了。让我添加一个答案。

标签: python git pip setup.py


【解决方案1】:

在检查 pip 源代码后,我发现了私有 BitBucket 存储库的正确语法。

带有 URL 的包的一般格式是 <package name>@<URI>,并且 URI 必须以 <scheme>:// 开头。

所以我把它改成:

anotherpackage@git+ssh://git@bitbucket.org:myorg/anotherpackage.git

然后我得到一个不同的错误 - 这次 git 命令(由 pip 调用)抱怨存储库 URL ssh://git@bitbucket.org:myorg/anotherpackage.git

我检查了ssh:// URL 格式的git 文档,发现主机名和组织部分必须用/ 分隔,而不是:

ssh://git@bitbucket.org/myorg/anotherpackage.git

这个网址可以正常工作。我还从pip 源代码中了解到,可以通过附加@<rev-spec> 来指定实际的修订/分支/标签,因此我可以在install_requires 中使用以下内容指定例如标签0.0.1

anotherpackage@git+ssh://git@bitbucket.org:myorg/anotherpackage.git@0.0.1

我仍然存在的唯一问题是,当我更改修订版并再次运行 pip3 install -e . 时,它不会检测到更改(即使使用 --upgrade 运行时也是如此)。我必须手动卸载包(pip3 uninstall anotherpackage)并再次运行pip3 install -e .

【讨论】:

  • 太好了,这是我找到的唯一问题/答案。我认为即使使用--upgrade 标志它也不会更新依赖项是有道理的,因为这是其他包的一般行为。如果它唯一改变的东西,你总是可以升级依赖本身。
  • @piotrek-bzdyl,谢谢。我认为这行得通,但这最终从 pypi 或缓存中获取包,而不是从 github 获取:Collecting mkdocs-git-committers-plugin@ git+ssh://git@github.com:ojacques/mkdocs-git-committers-plugin.git (from mkdocs-dxc==0.2.0)Downloading https://files.pythonhosted.org/packages/45/59/28729f789f2e74666277e40f953e22294bc3076ebf53137b93af65592874/mkdocs-git-committers-plugin-0.1.8.tar.gz 你有同样的经历吗?
  • 我有同样的问题,我无法从 repo 安装任何东西。 Pip 总是从 PyPi 获取
  • @ojacques 我仅将这些 git URL 用于我自己的私有包,我不确定您是否可以覆盖 pip 存储库中发布的公共包。
  • 我可以使用 file://./mypackage 吗?
猜你喜欢
  • 2016-11-14
  • 2023-02-22
  • 2015-04-08
  • 1970-01-01
  • 2012-12-11
  • 2020-06-10
  • 1970-01-01
  • 2022-08-20
  • 2018-06-16
相关资源
最近更新 更多