本文档简要介绍了虚拟代码库。如需了解如何创建虚拟代码库,请参阅创建虚拟代码库。
Artifact Registry 配额和限制适用于虚拟代码库。
虚拟仓库的工作原理
虚拟代码库可作为单个访问点,用于从一个或多个上游代码库下载、安装或部署采用相同格式的工件。上游代码库可以是 Artifact Registry 标准制品库或远程制品库。
其他代码库模式包括:
- 标准:默认的代码库模式。您可以直接将工件(例如私有软件包)上传或发布到标准代码库。虽然您可以直接从各个标准代码库下载,但使用虚拟代码库访问代码库组可以简化工具配置。
- 远程(仅限语言软件包仓库):Maven Central 或 PyPI 等公共仓库中工件的拉取缓存。它充当公共仓库的代理,以便您更好地控制外部依赖项。
使用场景和优势
- 客户端配置更简单
对于仅需要对代码库具有读取权限的任务,您只需配置单个 Artifact Registry 代码库即可访问存储在多个上游代码库中的工件。
例如:
- Maven 软件包的虚拟制品库可以从 Artifact Registry 标准制品库提供私有 Java 软件包,并从缓存 Maven Central 中的公共软件包的远程制品库提供公共 Java 软件包。
- 虚拟代码库可以从不同团队拥有的多个上游标准代码库中提供私有 Python 软件包。每个团队都有对其上游代码库的写入权限,但使用虚拟代码库下载其他团队的软件包。
- 更安全的依赖项解析
您可以为上游代码库分配优先级,以便更好地控制 Artifact Registry 在请求的工件位于多个上游代码库中时选择哪个代码库。
在客户端中配置混合使用私有代码库和公共代码库时,某些工具(例如 Python
pip
工具)无法提供控制搜索顺序的方法。此类配置容易受到依赖项混淆攻击,攻击者会将包含有害代码的软件包新版本上传到公共代码库,以诱骗客户端选择有害版本。您可以将远程代码库和虚拟代码库搭配使用,以降低此风险:
- 创建一个远程代码库作为公开代码库的代理。
- 为您的私有软件包创建标准代码库。
- 创建一个虚拟代码库,并将其配置为在两个代码库中存在同一软件包的版本时优先使用标准代码库。
- 将软件包管理器和其他工具配置为仅从虚拟仓库读取,以便客户端逻辑不参与仓库选择。
如需了解其他依赖项管理最佳实践,请参阅依赖项管理。
虚拟仓库如何选择上游仓库
每个上游仓库都必须配置优先级。优先级是一个整数,用作权重,而非排名。这意味着,优先级值较高的代码库的优先级高于优先级值较低的代码库。
当您请求位于多个上游代码库中的工件时,Artifact Registry 会使用以下优先级逻辑:
- 系统会优先使用值最高的代码库。例如,值
10
的优先级高于值1
。 - 如果多个上游代码库具有相同的优先级,则工件可以从其中任何一个代码库提供。
当您直接将客户端配置为搜索虚拟制品库和其他制品库时,客户端可能仍会从 Artifact Registry 以外的制品库下载工件。
例如,如果您将 Python pip
工具配置为搜索 PyPI 和虚拟仓库,系统可能会直接从 PyPI 下载您的软件包,因为 pip
始终会选择最新版本的软件包,无论其来自哪个仓库。如果 pip
配置为仅搜索虚拟仓库,那么您可以控制所有上游仓库的优先级,包括充当 PyPI 代理的上游远程仓库。
支持的代码库格式
您可以为以下 Artifact Registry 代码库格式创建虚拟代码库:
语言包:
操作系统软件包:
如果您刚开始接触 Artifact Registry,可以通过快速入门了解如何为这些格式设置标准代码库。
限制
除了 Artifact Registry 配额和限制之外,虚拟代码库还存在以下限制:
- 标准 Artifact Registry 上游代码库必须与虚拟代码库位于同一区域或多区域,但可以位于不同的 Google Cloud 项目中。
Maven 虚拟制品库不允许将版本政策设置为快照或发布版本。
Apt 和 Yum 上游必须是 Artifact Registry 标准制品库。
Apt 和 Yum 标准代码库会在导入、上传或删除软件包后异步更新软件包索引。对于小型代码库,重新生成索引可能需要几秒钟。对于较大的代码库,重新编制索引可能需要几分钟或更长时间。重新编制索引完成后,对仓库所做的更改会显示给 Apt 和 Yum 客户端。