问题描述
我有一个本地GitLab安装程序,它带有一个本地PyPI服务器,用于存储公司内部的Python程序包。
如何配置我的PyPI在两个索引服务器中搜索包?
我了解了.pypirc
/ pip/pip.ini
,发现了各种设置,但到目前为止还没有解决办法。
- 大多数解决方案将所有搜索永久切换到其他索引服务器。但是我希望能够像往常一样从pypi.org安装和更新软件包,而有些软件包来自本地索引。
- 使用凭据将多个索引服务器设置为接缝,仅限于distutils(例如,由twine使用),而pip不使用
- 如果在
[global]
或[install]
中配置索引服务器,会造成混乱。我假设后一个是pip install
的规则子集。 (此处的文档尚不清楚。) - 虽然麻线可以引用配置文件中的存储库条目,例如
-r gitlab
指向[gitlab]
部分,但是pip不能使用这样的命名引用...
所以我要实现:
-
pip
应该能够从pypi.org安装和更新常规包,例如colorama -
pip
应该能够从gitlab.company.com安装和更新软件包- 使用用户名(
__token__
)和密码(7a3b62342c784d87
)的身份验证必须有效
- 使用用户名(
到目前为止的实验:
[global]
[install]
find-links =
https://pypi.org
https://gitlab.company.de/api/v4/projects/2142423/packages/pypi
trusted-host =
https://pypi.org
https://gitlab.company.de/api/v4/projects/2142423/packages/pypi
[distutils]
index-servers =
gitlab
[gitlab]
repository = https://gitlab.company.de/api/v4/projects/2142423/packages/pypi
username = __token__
password = geheim
解决方法
目标
-
pip install
应该从GitLab以及PyPi存储库安装/更新软件包。如果两个软件包中都存在相同的软件包,则首选PyPi。 。
-
pip install
应该支持身份验证。首选,如果可以通过某种方式使其从配置文件中读取,则无需重复指定。
理论
-
pip install
支持--extra-index-url
指定其他PyPi索引。也可以通过pip.conf
文件提供同样的功能。 -
pip
使用requests
来支持~/.netrc
作为配置文件(docs)。
步骤
- 在
pip.conf
建议的任何位置创建一个pip.ini
(如果是Windows,则为pip config -v list
。 - 将您的GitLab PyPi索引URL添加到
pip.conf
。
[install]
extra-index-url = https://gitlab.com/api/v4/projects/12345678/packages/pypi/simple
- 创建或更新您的
~/.netrc
文件,并添加有关GitLab的身份验证详细信息。
machine gitlab.com
login <token-name>
password <token-pass>
- 我们现在可以像安装
pip install <package-name>
一样简单地安装软件包。pip
现在将查看两个索引以找到您的软件包,并优先选择index-url
所指向的软件包。
其他信息
-
pip search
可能也有可能,只要支持多个索引。到那时,需要手动指定应使用哪个PyPi索引URL。 GitLab似乎不支持pip search
,因为当指定为PyPi索引时,它会引发 415 Client Error:Unsupported Media Type 。 - 对于您的疑问,
pip.conf
中的每个部分都指向该特定命令,[install]
为pip install
提供配置,[search]
为pip search
提供等等。 。[global]
可能是指可以为所有命令pip install
或pip search
指定的参数。 -
.pypirc
文件专门用于配置与上载相关的软件包索引(由twine / flint使用),其中pip.conf
与配置pip
关联,后者管理本地的python软件包系统。
尝试一下(基于来自https://github.com/pypa/pip/issues/6797和Can pip.conf specify two index-url at the same time?的信息):
[global]
index-url = http://pypi.org/simple
trusted-host = pypi.org
gitlab.company.de
extra-index-url= https://username:password@gitlab.company.de/api/v4/projects/2142423/packages/pypi