我构建了一个包(我们称之为 mypackage),它依赖于 PyPi 上提供的知名第三方模块(即 pandas)。 我已将 mypackage 上传到自定义的类似 PyPi 的服务器上 (pypicustom)。我正在努力将它安装在我所能访问的只是 PyPi 镜像的环境中(我们称之为 pypiproxy)。
pip install --index-url http://custompypi/ mypackage
不起作用,因为明显找不到pandas。
pip install --index-url http://pypiproxy/ --extra-index-url http://custompypi/ mypackage
一直有效,直到有人在 PyPi 上上传名为 mypackage 的包。
我能想到的最接近的是:
pip install --index-url http://custompypi/ --no-dependencies mypackage
pip install --index-url http://pypiproxy/ --extra-index-url http://custompypi/ mypackage
感觉不对。
有什么想法吗?
我一直在对问题最接近的解决方案进行增量改进。
假设两个包索引 URL 是
A
和 B
,您希望 mypackage
来自 A
,并且其依赖项来自 B
。在我的用例中,A
是TestPyPI,B
是PyPI。
首先从
mypackage
安装 A
,无需依赖,就像问题中一样:
$ pip install --no-deps --index-url 'A' mypackage
然后仅从
B
和 安装依赖项
$ pip install --index-url 'B' mypackage | grep 'Requirement already satisfied: mypackage' > /dev/null
添加的
grep
让您断言 pip install
没有尝试从 mypackage
重新安装 B
。如果在 'Requirement already satisfied: mypackage'
的输出中找不到 pip install
,该命令将以状态 1 退出。这可以让您确定剩下的 mypackage
确实是来自 A
的那个。
我们还可以在第二个命令中省略
--extra-index-url 'A'
,前提是 mypackage
不依赖于 A
的任何其他分布。 pip install
可以解决在配置的索引中找不到的已安装发行版的依赖关系。
如果您想保留第二个命令的标准输出(例如工作流程日志),您可以 在
tee /dev/tty
和 pip install
之间添加一个管道到
grep
。
我正在使用 Amazon Code Artifact 并且有类似的案例。
您可以将 pip 配置为在多个索引处搜索包,方法是设置 index-url 和 extra-index-url 带有
pip config
。
pip config set global.index-url https://pypiproxy/
pip config set global.extra-index-url https://pypi.python.org/simple/
运行这两个命令后,您可以照常安装,pip 将搜索这两个位置,而无需在
pip install
命令中指定它们。
另请查看pip.conf可以同时指定两个index-url吗?好像也可能相关。