我花了一整天的时间阅读有关从 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-links
和dependency_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'
],
...
我做错了什么还是不支持?
不支持作为依赖项的 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 依赖项。
感谢您的详细解释,我非常感谢您的帮助。
此线程已被自动锁定,因为它在关闭后没有任何近期活动。 请为相关错误打开一个新问题。
最有用的评论
不支持作为依赖项的 PEP 508 URL 要求。
是的。 见下文。
pyproject.toml
仅用作指定构建时间依赖项和工具配置的地方。 除此之外的任何事情都是由您使用的工具实现的。是的。 这就是#4187 背后的全部动机。
我们禁用了在依赖项中使用 PEP 508 URL 要求的能力,因为我们不希望从 PyPI 安装的包导致 pip 访问任意 Web URL。 基本上,
pip install spam
不应该让 pip 接触到除 PyPI 之外的任何东西。当前在#4187 中提出的解决方案是简单地修改阻塞条件,以便它仅在实际直接从 PyPI 安装包时阻塞 URL 依赖项,以便任何其他安装模式都可以使用 PEP 508 URL 依赖项。