请求包含上游存储库的程序包版本
当客户端(例如 npm)从包含多个上游存储库且名为 my_repo 的 CodeArtifact 存储库请求程序包版本时,会发生以下情况:
-
如果
my_repo包含请求的程序包版本,则将该版本返回给客户端。 -
如果
my_repo不包含请求的程序包版本,则 CodeArtifact 会在my_repo的上游存储库中查找该版本。如果找到了程序包版本,则会将对该版本的引用复制到my_repo,并将程序包版本返回给客户端。 -
如果
my_repo和其上游存储库都不包含程序包版本,则会向客户端返回 HTTP 404Not Found响应。
使用 create-repository 或 update-repository 命令添加上游存储库时,它们传递给 --upstreams 参数的顺序决定了在请求程序包版本时它们的优先级。按照在请求程序包版本时您希望 CodeArtifact 使用的顺序,使用 --upstreams 指定上游存储库。有关更多信息,请参阅 上游存储库优先顺序。
一个存储库允许的直接上游存储库的最大数量为 10。由于直接上游存储库也可以有自己的直接上游存储库,因此 CodeArtifact 会在 10 个以上的存储库中搜索程序包版本。当请求程序包版本时,CodeArtifact 可以查找的最大存储库数量为 25。
上游存储库的程序包保留
如果在上游存储库中找到了请求的程序包版本,则会保留对该版本的引用,并且始终可以从下游存储库中使用。保留的程序包版本不受以下任何因素的影响:
-
删除上游存储库。
-
断开上游存储库与下游存储库的连接。
-
从上游存储库中删除程序包版本。
-
在上游存储库中编辑程序包版本(例如,向其中添加新资产)。
通过上游关系提取程序包
如果 CodeArtifact 存储库与具有外部连接的存储库存在上游关系,则在上游存储库中找不到请求的程序包时,会从外部存储库复制该程序包。例如,考虑以下配置:名为 repo-A 的存储库有一个名为 repo-B 的上游存储库。repo-B 与 https://npmjs.com
如果将 npm 配置为使用 repo-A 存储库,则运行 npm install 会触发将程序包从 https://npmjs.comrepo-B。已安装的版本也会提取到 repo-A。下面的示例会安装 lodash。
$ npm config get registry https://my_domain-111122223333.d.codeartifact.us-west-2.amazonaws.com/npm/my-downstream-repo/ $ npm install lodash + lodash@4.17.20 added 1 package from 2 contributors in 6.933s
运行 npm install 后,repo-A 仅包含最新版本 (lodash 4.17.20),因为这是 npm 从 repo-A 提取的版本。
aws codeartifact list-package-versions --repositoryrepo-A--domainmy_domain\ --domain-owner111122223333--formatnpm--packagelodash
输出示例:
{ "package": "lodash", "format": "npm", "versions": [ { "version": "4.17.15", "revision": "REVISION-1-SAMPLE-6C81EFF7DA55CC", "status": "Published" } ] }
由于 repo-B 与 https://npmjs.comrepo-B 中。任何与 repo-B 建立了上游关系的下游存储库可能已经提取这些程序包版本。
repo-B 中记录了随着时间推移从 https://npmjs.comlodash 程序包的所有版本,可以使用 list-package-versions,如下所示。
aws codeartifact list-package-versions --repositoryrepo-B--domainmy_domain\ --domain-owner111122223333--formatnpm--packagelodash--max-results 5
输出示例:
{ "package": "lodash", "format": "npm", "versions": [ { "version": "0.10.0", "revision": "REVISION-1-SAMPLE-6C81EFF7DA55CC", "status": "Published" }, { "version": "0.2.2", "revision": "REVISION-2-SAMPLE-6C81EFF7DA55CC", "status": "Published" }, { "version": "0.2.0", "revision": "REVISION-3-SAMPLE-6C81EFF7DA55CC", "status": "Published" }, { "version": "0.2.1", "revision": "REVISION-4-SAMPLE-6C81EFF7DA55CC", "status": "Published" }, { "version": "0.1.0", "revision": "REVISION-5-SAMPLE-6C81EFF7DA55CC", "status": "Published" } ], "nextToken": "eyJsaXN0UGFja2FnZVZlcnNpb25zVG9rZW4iOiIwLjIuMiJ9" }
中间存储库中的程序包保留
CodeArtifact 允许链接上游存储库。例如,repo-A 可以使用 repo-B 作为上游,而 repo-B 也可以使用 repo-C 作为上游。这个配置意味着在 repo-A 中可以获取 repo-B 和 repo-C 中的程序包版本。
当程序包管理器连接到存储库 repo-A 并从存储库 repo-C 中提取程序包版本时,程序包版本将不会保留在存储库 repo-B 中。程序包版本将仅保留在最下游的存储库中,在此示例中为 repo-A。程序包版本不会保留在任何中间存储库中。对于较长的链也是如此;例如,如果有四个存储库 repo-A、repo-B、repo-C 和 repo-D,一个连接到 repo-A 的程序包管理器从 repo-D 提取程序包版本,则程序包版本将保留在 repo-A 中,但不会保留在 repo-B 或 repo-C 中。
从外部存储库提取程序包版本时,程序包保留行为与之类似,不同之处在于程序包版本始终保留在连接了外部连接的存储库中。例如,repo-A 使用 repo-B 作为上游。repo-B 使用 repo-C 作为上游,并且 repo-C 还配置了 npmjs.com 作为外部连接;请参见下图。
如果连接到 repo-A 的程序包管理器请求程序包版本(例如,lodash 4.17.20),而三个存储库中的任何一个都不存在该程序包版本,则将从 npmjs.com 提取该程序包版本。当提取 lodash 4.17.20 时,该版本将保留在 repo-A(因为这是最下游的存储库)和 repo-C(因为它与 npmjs.com 建立了外部连接)中。lodash 4.17.20 不会保留在 repo-B 中(因为这是中间存储库)。