

亚马逊 CodeCatalyst 不再向新买家开放。现有客户可以继续正常使用该服务。有关更多信息，请参阅 [如何从中迁移 CodeCatalyst](migration.md)。

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 请求包含上游存储库的程序包版本
<a name="packages-upstream-repositories-request"></a>

以下示例显示了包管理器从具有上游存储库的软件包存储库请求 CodeCatalyst 包时可能出现的情况。

在此示例中，程序包管理器（例如 `npm`）从名为 `downstream` 的具有多个上游存储库的程序包存储库中请求程序包版本。在请求程序包时，可能会出现以下情况：
+  如果 `downstream` 包含请求的程序包版本，则将该版本返回给客户端。
+  如果`downstream`不包含请求的软件包版本，则按其配置`downstream`的 CodeCatalyst 搜索顺序在上游存储库中搜索该版本。如果找到了程序包版本，则会将对该版本的引用复制到 `downstream`，并将程序包版本返回给客户端。
+  如果 `downstream` 和其上游存储库都不包含程序包版本，则会向客户端返回 HTTP 404 `Not Found` 响应。

 一个存储库允许的直接上游存储库的最大数量为 10。请求软件包版本时 CodeCatalyst 搜索的最大存储库数为 25。

## 上游存储库的程序包保留
<a name="package-retention-upstream-repos"></a>

如果在上游存储库中找到了请求的程序包版本，则会保留对该版本的引用，并且该引用在请求它的存储库中始终可用。这将确保您能够在上游存储库意外中断时访问您的程序包。保留的程序包版本不受以下任何因素的影响：
+  删除上游存储库。
+  断开上游存储库与下游存储库的连接。
+  从上游存储库中删除程序包版本。
+  在上游存储库中编辑程序包版本（例如，向其中添加新资产）。

## 通过上游关系提取程序包
<a name="fetching-packages-through-an-upstream-relationship"></a>

CodeCatalyst 可以通过多个名为上游存储库的链接存储库获取软件包。如果一个 CodeCatalyst 包存储库与另一个包存储库有上游连接，而另一个 CodeCatalyst 包存储库与网关存储库有上游连接，则会从外部存储库中复制对不在上游存储库中的软件包的请求。例如，考虑以下配置：名为的存储库与网关存储库`repo-A`有上游连接`npm-public-registry-gateway`。 `npm-public-registry-gateway`与公共软件包存储库有上游连接[https://npmjs.com](https://npmjs.com)。

![\[简单的上游存储库示意图，其中显示了链接在一起的三个存储库。\]](http://docs.aws.amazon.com/zh_cn/codecatalyst/latest/userguide/images/packages/upstream-with-external.png)


如果配置`npm`为使用`repo-A`存储库，则运行`npm install`会启动将软件包从复制[https://npmjs.com](https://npmjs.com)到`npm-public-registry-gateway`。已安装的版本也会提取到 `repo-A`。下面的示例会安装 `lodash`。

```
$ npm config get registry
https://packages.region.codecatalyst.aws/npm/space-name/proj-name/repo-name/
$ 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` 提取的版本。

 由于与`npm-public-registry-gateway`有外部上游连接 [https://npmjs.com](https://npmjs.com)，因此所有从中导入的软件包版本[https://npmjs.com](https://npmjs.com)都存储在中`npm-public-registry-gateway`。任何具有指向 `npm-public-registry-gateway` 的上游连接的下游存储库，均可能已提取这些程序包版本。

的内容为您`npm-public-registry-gateway`提供了一种查看一段时间以来导入的所有软件包和软件包版本的方法。[https://npmjs.com](https://npmjs.com)

## 中间存储库中的程序包保留
<a name="package-retention-intermediate-repositories"></a>

 CodeCatalyst 允许您链接上游存储库。例如，`repo-A` 可以使用 `repo-B` 作为上游存储库，而 `repo-B` 可以使用 `repo-C` 作为上游存储库。这个配置意味着在 `repo-A` 中可以获取 `repo-B` 和 `repo-C` 中的程序包版本。

![\[简单的上游存储库示意图，其中显示了链接在一起的三个存储库。\]](http://docs.aws.amazon.com/zh_cn/codecatalyst/latest/userguide/images/packages/upstream-chaining.png)


 当程序包管理器连接到存储库 `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` 使用 `npm-public-registry-gateway` 作为上游存储库，它具有与公共存储库 **npmjs.com** 的上游连接；请参见下图。

![\[上游存储库图表，其中显示了三个存储库链接在一起，并与 npmjs.com 建立了外部上游连接。\]](http://docs.aws.amazon.com/zh_cn/codecatalyst/latest/userguide/images/packages/upstream-chaining-external.png)


 如果连接到 `repo-A` 的程序包管理器请求特定的程序包版本（例如，*lodash 4.17.20*），而三个存储库中的任何一个都不存在该程序包版本，则将从 **npmjs.com** 提取该程序包版本。当提取 *lodash 4.17.20* 时，该版本将保留在 `repo-A`（因为这是最下游的存储库）和 `npm-public-registry-gateway`（因为它具有与公共外部存储库 **npmjs.com** 的上游连接）中。*lodash 4.17.20* 不会保留在 `repo-B` 中（因为这是中间存储库）。