Pip: 直接 URL PEP 508 支持和从 Git 安装子依赖项

创建于 2018-07-03  ·  3评论  ·  资料来源: pypa/pip

  • 点子版本:10.0.1
  • Python版本:3.7.0
  • 操作系统:macOS

我花了一整天的时间阅读有关从 git 安装子依赖项的信息,但我仍在努力寻找正确的解决方案。

我的用例

我分叉了一个现有的 Python 库(在 PyPi 上可用),添加了一些不太可能在上游合并的更改。
我的一些项目依赖于库分支。 以前它是一个应用程序,我使用 Pipenv 来管理应用程序依赖项,在那里我可以轻松地指定从 Git 在 Pipfile 中安装特定的分支/提交。 我的应用程序增长了,现在我将它转换为库(它不会在 PyPi 上发布)。 我需要解决来自 Git 的库的子依赖问题。
我至少阅读了以下问题:#3610、#4187、#2124、#5384 和许多其他问题,当然还有 PEP。 当我读完时,我比开始时更加困惑。

根据我在 pip 10 中实现 PEP-508 的理解,我应该能够使用:

setup(
    name='dmfigol',
...
    install_requires=[
        "requests",
        'smartsheet-python-sdk @ git+ssh://[email protected]/dmfigol/smartsheet-python-sdk@dev#egg=smartsheet-python-sdk-1.3.3',
    ],
)

但它不起作用:

-> % pip install git+https://<private-git>/dmfigol/my-test-project.git
Collecting git+https://<private-git>/dmfigol/my-test-project.git
  ...
Direct url requirement (like smartsheet-python-sdk@ git+ssh://[email protected]/dmfigol/smartsheet-python-sdk@dev#egg=smartsheet-python-sdk-1.3.3) are not allowed for dependencies

我的问题:
1)我做错了什么还是不支持?
2)如果不支持,会支持吗?
3)我是否正确理解,如果我想从 setup.py 迁移到更具声明性的内容,我也可以在pyproject.toml使用类似的语法?
4) 是今天唯一可用的解决方案在setup.py使用--process-dependency-linksdependency_links部分吗?
5) 当上游将 PyPi 上的库更新到 1.3.4 或更高版本时会发生什么,而我仍然想使用我的分叉版本 1.3.3?

谢谢

UPD:如果您偶然发现此线程,则在实施 #4187 之前当前有效的解决方案:

setup(
    ...
    install_requires=[
        "smartsheet-python-sdk==10.1.3.3",
    ],
    dependency_links=[
        'https://github.com/dmfigol/smartsheet-python-sdk/archive/no-setuptools-scm.zip#egg=smartsheet-python-sdk-10.1.3.3'
    ],
...
auto-locked support

最有用的评论

我做错了什么还是不支持?

不支持作为依赖项的 PEP 508 URL 要求。

如果不支持,会支持吗?

是的。 见下文。

如果我想从 setup.py 迁移到更具声明性的内容,我是否正确理解我也可以在 pyproject.toml 中使用类似的语法?

pyproject.toml仅用作指定构建时间依赖项和工具配置的地方。 除此之外的任何事情都是由您使用的工具实现的。

今天唯一可用的解决方案是在 setup.py 中使用 --process-dependency-links 和 dependency_links 部分吗?

是的。 这就是#4187 背后的全部动机。


我们禁用了在依赖项中使用 PEP 508 URL 要求的能力,因为我们不希望从 PyPI 安装的包导致 pip 访问任意 Web URL。 基本上, pip install spam不应该让 pip 接触到除 PyPI 之外的任何东西。

当前在#4187 中提出的解决方案是简单地修改阻塞条件,以便它仅在实际直接从 PyPI 安装包时阻塞 URL 依赖项,以便任何其他安装模式都可以使用 PEP 508 URL 依赖项。

所有3条评论

我做错了什么还是不支持?

不支持作为依赖项的 PEP 508 URL 要求。

如果不支持,会支持吗?

是的。 见下文。

如果我想从 setup.py 迁移到更具声明性的内容,我是否正确理解我也可以在 pyproject.toml 中使用类似的语法?

pyproject.toml仅用作指定构建时间依赖项和工具配置的地方。 除此之外的任何事情都是由您使用的工具实现的。

今天唯一可用的解决方案是在 setup.py 中使用 --process-dependency-links 和 dependency_links 部分吗?

是的。 这就是#4187 背后的全部动机。


我们禁用了在依赖项中使用 PEP 508 URL 要求的能力,因为我们不希望从 PyPI 安装的包导致 pip 访问任意 Web URL。 基本上, pip install spam不应该让 pip 接触到除 PyPI 之外的任何东西。

当前在#4187 中提出的解决方案是简单地修改阻塞条件,以便它仅在实际直接从 PyPI 安装包时阻塞 URL 依赖项,以便任何其他安装模式都可以使用 PEP 508 URL 依赖项。

感谢您的详细解释,我非常感谢您的帮助。

此线程已被自动锁定,因为它在关闭后没有任何近期活动。 请为相关错误打开一个新问题。

此页面是否有帮助?
0 / 5 - 0 等级