用于 管理 Python 包的 Google Artifact 注册表文档表示,针对虚拟存储库运行
pip install PACKAGE
时:
如果您请求的版本在多个上游存储库中可用,ArtifactRegistry 将根据为虚拟存储库配置的优先级设置选择要使用的上游存储库。
在“虚拟仓库概述”中,解释虚拟仓库如何选择上游仓库的部分甚至明确讨论了
pip
的情况:
例如,如果您配置Python pip工具来搜索PyPI和虚拟存储库,则您的包可能会直接从PyPI下载,因为pip将始终选择包的最新版本,无论它来自哪个存储库。如果将 pip 配置为仅搜索虚拟存储库,则您可以控制所有上游存储库的优先级,包括充当 PyPI 代理的上游远程存储库。
当使用
==
指定软件包版本时,这将按记录工作,但是当使用其他要求说明符(或无要求说明符)时,pip 将安装与所有上游中的说明符匹配的最高版本,完全忽略优先级设置。
如何配置虚拟存储库,以便仅从该上游获取具有较高优先级的上游中存在的包,而不管具有较低优先级的上游中的可用版本如何?
例如,我创建了一个标准存储库来存储我自己的包(
python-repo
),一个用于访问 PyPi 的远程存储库(pypi-proxy
),以及一个聚合 python-repo 和 pypi-proxy 的虚拟存储库,优先级分别为 100和 10 (virtual-python-repo
):
PROJECT_ID=my-project-123456
LOCATION=us-west1
gcloud artifacts repositories create python-repo --repository-format=python \
--location="$LOCATION" --description="local repo"
gcloud artifacts repositories create pypi-proxy --repository-format=python \
--location="$LOCATION" --description="PyPi proxy" \
--mode=remote-repository --remote-repo-config-desc="PyPi" \
--remote-python-repo=PYPI --project="$PROJECT_ID"
gcloud artifacts repositories create virtual-python-repo --repository-format=python \
--location="$LOCATION" --description="Virtual repo" \
--mode=virtual-repository \
--upstream-policy-file=policies.json --project="$PROJECT_ID" \
与
policies.json
:
[{
"id": "python-repo",
"repository": "projects/my-project-123456/locations/us-west1/repositories/python-repo",
"priority": 100
},{
"id": "pypi-proxy",
"repository": "projects/my-project-123456/locations/us-west1/repositories/pypi-proxy",
"priority": 10
}]
我将
pip.conf
和 .pypirc
设置为指向 virtual-python-repo
。
使用此设置,如果我创建一个名为“sampleproject”的新项目(该项目已存在于 PyPi 上,版本从 1.2.0 到 4.0.0),这就是我得到的行为:
如果我将版本设置为1.0.0,则构建并将sampleproject-1.0.0推送到
python-repo
:
pip install sampleproject==1.0.0
从 python-repo
pip install sampleproject
从 PyPi
期望的行为是始终从 python-repo 安装示例项目并忽略 pypi 的版本。我知道仅凭
pip
这是不可能的,但我希望虚拟回购能够强制执行此类政策。
与 Google 支持人员讨论后,上述行为似乎是预期的。虚拟存储库仍然收集所有上游所有相关版本的并集,无论其优先级如何。上游存储库的优先级仅用于当特定版本在多个上游可用时选择特定上游。
这意味着,对于Python虚拟存储库,为了确保从私有存储库安装软件包,需要使用“==”作为版本说明符(并确保指定的版本确实在私有存储库中)回购协议,并且私人回购协议具有最高优先级)。