本文档简要介绍了虚拟代码库。如需了解如何创建虚拟代码库,请参阅创建虚拟代码库。
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 代码库存在其他限制:
- 您只能将标准代码库用作上游代码库。
在导入、上传或删除软件包后,Apt 和 Yum 标准代码库会异步更新软件包索引。对于小型代码库,重新生成索引可能需要几秒钟的时间。对于较大的代码库,重新编入索引可能需要几分钟或更长时间。重新编入索引完成后,Apt 和 Yum 客户端将可以看到对代码库的更改。