

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

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

# 配置并使用上游存储库
<a name="packages-upstream-repositories"></a>

您可以将网关存储库和其他 CodeCatalyst 软件包存储库作为上游连接到您的软件包存储库。这样，程序包管理器客户端就可以使用单个程序包存储库端点访问多个程序包存储库中包含的程序包。以下是使用上游存储库的主要好处：
+ 您只需要为程序包管理器配置一个存储库端点，即可从多个来源进行提取。
+ 从上游存储库中使用的程序包存储在下游存储库中，这可确保即使上游存储库发生意外中断或上游存储库中的程序包被删除，您的程序包也可用。

在创建程序包存储库时，可以添加上游存储库。您还可以在 CodeCatalyst 控制台中从现有软件包存储库中添加或删除上游存储库。

当您将网关存储库添加为上游存储库时，程序包存储库将连接到网关存储库的相应公共程序包存储库。有关支持的公共程序包存储库的列表，请参阅[支持的外部程序包存储库及其网关存储库](packages-connect-external.md#packages-upstream-repositories-supported-external)。

您可以将多个存储库链接起来以作为上游存储库。例如，假设您的团队创建了一个名为的存储库，`project-repo`并且已经在使用另一个名为的存储库`team-repo`，该存储库已**npm-public-registry-gateway**添加为上游存储库，该存储库已连接到公共 npm 存储库。`npmjs.com`您可以将 `team-repo` 作为上游存储库添加到 `project-repo`。在此情况下，您只需将程序包管理器配置为使用 `project-repo` 从 `project-repo`、`team-repo`、`npm-public-registry-gateway` 和 `npmjs.com` 中拉取程序包即可。

**Topics**
+ [

# 添加上游存储库
](packages-upstream-repositories-add.md)
+ [

# 编辑上游存储库的搜索顺序
](packages-upstream-repositories-search-order.md)
+ [

# 请求包含上游存储库的程序包版本
](packages-upstream-repositories-request.md)
+ [

# 移除上游存储库
](packages-upstream-repositories-remove.md)

# 添加上游存储库
<a name="packages-upstream-repositories-add"></a>

将公共包存储库或其他 CodeCatalyst 软件包存储库作为上游存储库添加到下游存储库中，可以将上游存储库中的所有包都提供给连接到下游存储库的包管理器。

**添加上游存储库**

1. 在导航窗格中，选择**程序包**。

1. 在**程序包存储库**页面上，选择要将上游存储库添加到的程序包存储库。

1. 在程序包存储库的名称下，选择**上游**，然后选择**选择上游存储库**。

1. 在**选择上游类型**中，选择下列选项之一：
   + **网关存储库**

     您可以从可用网关存储库的列表中进行选择。
**注意**  
要连接到公共外部包颁发机构，例如 Maven Central、npmjs.com 或 Nuget Gallery，请 CodeCatalyst 使用网关存储库作为中间存储库，用于搜索和存储从外部存储库提取的包。这样可以减少时间和数据传输，因为项目中的所有程序包存储库都将使用网关中间存储库中的程序包。有关更多信息，请参阅 [连接到公共外部存储库](packages-connect-external.md)。
   + **CodeCatalyst 存储库**

     您可以从项目中可用的 CodeCatalyst 软件包存储库列表中进行选择。

1. 选择所有要添加作为上游存储库的存储库后，选择**选择**，然后选择**保存**。

   有关更改上游存储库的搜索顺序的更多信息，请参阅[编辑上游存储库的搜索顺序](packages-upstream-repositories-search-order.md)。

添加上游存储库后，您可以使用连接到本地存储库的程序包管理器，从该上游存储库中获取程序包。您无需更新程序包管理器配置。有关从上游存储库请求程序包版本的更多信息，请参阅[请求包含上游存储库的程序包版本](packages-upstream-repositories-request.md)。

# 编辑上游存储库的搜索顺序
<a name="packages-upstream-repositories-search-order"></a>

CodeCatalyst 按其配置的搜索顺序搜索上游存储库。找到包裹后， CodeCatalyst 停止搜索。您可以更改在上游存储库中搜索程序包时搜索这些存储库的顺序。

**编辑上游存储库的搜索顺序**

1. 在导航窗格中，选择**程序包**。

1. 在**程序包存储库**页面上，选择要编辑器上游存储库搜索顺序的程序包存储库。

1. 在程序包存储库的名称下，选择**上游**。

1. 在**上游存储库**部分中，您可以查看上游存储库及其搜索顺序。要更改搜索顺序，请将存储库拖放到列表中。

1. 编辑完上游存储库的搜索顺序后，选择**保存**。

# 请求包含上游存储库的程序包版本
<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` 中（因为这是中间存储库）。

# 移除上游存储库
<a name="packages-upstream-repositories-remove"></a>

如果您不再需要访问上游存储库中的程序包，可以从程序包存储库中移除上游存储库。

**警告**  
移除上游存储库时，可能会中断上游关系链，从而破坏您的项目或构建。

**移除上游存储库**

1. 在导航窗格中，选择**程序包**。

1. 在**程序包存储库**页面上，选择要从中移除上游存储库的程序包存储库。

1. 在程序包存储库的名称下，选择**上游**。

1. 在**编辑上游存储库**部分中，找到要移除的上游存储库，然后选择 ![\[Remove\]](http://docs.aws.amazon.com/zh_cn/codecatalyst/latest/userguide/images/packages/remove.png)。

1. 完成对上游存储库的移除后，选择**保存**。