即使在名称冲突的情况下,pip 也可以从 PyPi 上的私有索引中选择包?
Posted
技术标签:
【中文标题】即使在名称冲突的情况下,pip 也可以从 PyPi 上的私有索引中选择包?【英文标题】:pip to chose packages from a private index over PyPi even on name conflicts? 【发布时间】:2019-06-05 11:31:07 【问题描述】:我已经设置了一个devpi 服务器来托管我自己的 Python 模块。我想使用 pip 来安装它们,并让 pip 优先安装我的模块,而不是 PyPi 中的那些。
到目前为止,我有这个:
[global]
timeout = 60
index-url = http://devpi.example.org/root/public/+simple/
trusted-host = devpi.example.org
extra-index-url = http://devpi.example.org/root/pypi/+simple/
只要没有名称冲突,它就可以正常工作。如果有,最高版本胜出,这不是我想要的。
我真的不希望在 PyPi 上注册空项目只是为了保留名称。
有什么方法可以得到我想要的吗?
【问题讨论】:
您应该将包解析委托给devpi
:使用继承自root/pypi
的单个索引。 devpi
如果在本地索引上找不到包,则会从 PyPI 安装包,就像 PyPI 代理一样。但是,如果包是由您的本地索引提供的,devpi
将使用它,无论 PyPI 上可用的版本是什么。这是针对包欺骗的保护,默认开启。
【参考方案1】:
像这样修改了我的~/.config/pip/pip.conf
:
[global]
timeout = 60
trusted-host = devpi.example.org
index-url = http://devpi.example.org/root/public/+simple/
并确保/root/public
继承自/root/pypi
,如下所示:
devpi use http://devpi.example.org/
devpi use http://devpi.example.org/root/public --set-cfg
devpi login root --password="MyS3kre7Pwd"
devpi index /root/public bases=root/pypi # ← vital command.
跑步:
devpi list mead --all
给了我我想要的:
http://devpi.example.org/root/public/+f/d12/59ed3e5cf01ca/mead-0.4.0.dev1.tar.gz
http://devpi.example.org/root/public/+f/046/0f3dee895eb46/mead-0.4.0.dev0.tar.gz
http://devpi.example.org/root/pypi/+f/978/98e728d01b4d3/mead-0.0.11.tar.gz
http://devpi.example.org/root/pypi/+f/45d/b104905aeabc2/mead-0.0.10.tar.gz
http://devpi.example.org/root/pypi/+f/da0/c1b3bf979ca6a/mead-0.0.9.tar.gz
http://devpi.example.org/root/pypi/+f/49c/770889ecd3c7a/mead-0.0.8.tar.gz
http://devpi.example.org/root/pypi/+f/12d/10190b47367e8/mead-0.0.7.tar.gz
http://devpi.example.org/root/pypi/+f/34a/6dd6cd6c52c67/mead-0.0.6.tar.gz
http://devpi.example.org/root/pypi/+f/ba8/0cd76854e2253/mead-0.0.5.tar.gz
http://devpi.example.org/root/pypi/+f/1d7/6c5dd5229333b/mead-0.0.4.tar.gz
http://devpi.example.org/root/pypi/+f/47d/208d9cba5ea4e/mead-0.0.3.tar.gz
http://devpi.example.org/root/pypi/+f/20a/e16978e840e38/mead-0.0.2.tar.gz
【讨论】:
很好,这正是我的意思使用继承自root/pypi
的单个索引。现在,root/public
上找不到的包将从 PyPI 中提取,如果您在本地索引上注册了单个包版本,则 PyPI 上的包将被忽略。
@hoefling 感谢您的评论和时间阅读我的漫谈。以上是关于即使在名称冲突的情况下,pip 也可以从 PyPi 上的私有索引中选择包?的主要内容,如果未能解决你的问题,请参考以下文章
我可以在不在 pypi 中注册包的情况下制作 pip 可安装包吗?
如何在不使用pip或conda安装的情况下链接Selenium等库?