如何配置Google Artifact Registry虚拟仓库使pip遵循源优先级而非版本
如何配置Google Artifact Registry虚拟仓库,优先使用私有仓库的包(忽略PyPI同包的更高版本)
你遇到的问题是因为Artifact Registry的默认上游优先级仅在同一版本存在于多个上游仓库时生效,而当pip请求未指定版本的包时,系统会聚合所有上游的版本列表,由pip自行选择最高版本,这时通用优先级规则不生效。要实现“只要私有仓库存在该包,就仅从私有仓库安装”的需求,需要给私有仓库添加包匹配规则,将特定包的所有请求路由到私有仓库。
具体配置步骤
修改上游策略文件
policies.json
给私有仓库条目添加packageMatches字段,指定需要优先匹配的包名(支持精确匹配或通配符*匹配所有包):[{ "id": "python-repo", "repository": "projects/my-project-123456/locations/us-west1/repositories/python-repo", "priority": 100, "packageMatches": [{"packageName": "sampleproject"}] },{ "id": "pypi-proxy", "repository": "projects/my-project-123456/locations/us-west1/repositories/pypi-proxy", "priority": 10 }]- 如果你希望所有私有包都优先于PyPI,将
packageName设为"*"即可。
- 如果你希望所有私有包都优先于PyPI,将
更新虚拟仓库的上游策略
用gcloud命令应用修改后的策略:PROJECT_ID=my-project-123456 LOCATION=us-west1 gcloud artifacts repositories update virtual-python-repo \ --location="$LOCATION" \ --upstream-policy-file=policies.json \ --project="$PROJECT_ID"
验证效果
配置完成后:
- 执行
pip install sampleproject会直接从私有仓库python-repo拉取1.0.0版本,不会再查询PyPI的更高版本 - 私有仓库中不存在的包,仍会正常通过
pypi-proxy从PyPI获取
原理说明
包匹配规则的优先级高于通用的上游优先级:一旦请求的包名匹配了某个上游仓库的packageMatches规则,Artifact Registry会直接将该请求路由到对应仓库,不会再去其他上游查询版本信息,完美满足你“私有包优先”的需求。
内容的提问来源于stack exchange,提问作者Come Raczy
相关产品推荐
相关产品推荐

