

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

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

 当客户端（例如 npm）从具有多个上游存储库的名为`my_repo`的 CodeArtifact 存储库请求软件包版本时，可能会发生以下情况：
+  如果 `my_repo` 包含请求的程序包版本，则将该版本返回给客户端。
+  如果`my_repo`不包含请求的软件包版本，则在上游存储库中`my_repo`查 CodeArtifact找。如果找到了程序包版本，则会将对该版本的引用复制到 `my_repo`，并将程序包版本返回给客户端。
+  如果 `my_repo` 和其上游存储库都不包含程序包版本，则会向客户端返回 HTTP 404 `Not Found` 响应。

 使用 `create-repository` 或 `update-repository` 命令添加上游存储库时，它们传递给 `--upstreams` 参数的顺序决定了在请求程序包版本时它们的优先级。按照`--upstreams`请求软件包版本时 CodeArtifact 要使用的顺序指定上游存储库。有关更多信息，请参阅 [上游存储库优先顺序](repo-upstream-search-order.md)。

 一个存储库允许的直接上游存储库的最大数量为 10。由于直接上游存储库也可以拥有自己的直接上游存储库，因此 CodeArtifact 可以在 10 个以上的存储库中搜索软件包版本。请求软件包版本时 CodeArtifact 查看的最大存储库数为 25。

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

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

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

如果 CodeArtifact 存储库与具有外部连接的存储库存在上游关系，则会从外部存储库中复制对不在上游存储库中的包的请求。例如，考虑以下配置：名为的存储库`repo-A`有一个名为的上游存储库`repo-B`。 `repo-B`与有外部连接[https://npmjs.com](https://npmjs.com)。

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


如果配置`npm`为使用`repo-A`存储库，则运行`npm install`会触发将软件包从复制[https://npmjs.com](https://npmjs.com)到`repo-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 --repository repo-A --domain my_domain \
            --domain-owner 111122223333 --format npm --package lodash
```

输出示例：

```
{
    "package": "lodash",
    "format": "npm",
    "versions": [
        {
            "version": "4.17.15",
            "revision": "REVISION-1-SAMPLE-6C81EFF7DA55CC",
            "status": "Published"
        }
    ]
}
```

 由于与`repo-B`有外部连接 [https://npmjs.com](https://npmjs.com)，因此所有从中导入的软件包版本[https://npmjs.com](https://npmjs.com)都存储在中`repo-B`。任何与 `repo-B` 建立了上游关系的下游存储库可能已经提取这些程序包版本。

的内容`repo-B`提供了一种查看一段时间以来导入的所有软件包和软件包版本的方法。[https://npmjs.com](https://npmjs.com)例如，要查看一段时间内导入的 `lodash` 程序包的所有版本，可以使用 `list-package-versions`，如下所示。

```
aws codeartifact list-package-versions --repository repo-B --domain my_domain \
            --domain-owner 111122223333 --format npm --package lodash --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"
}
```

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

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

![\[简单的上游存储库示意图，其中显示了链接在一起的三个存储库。\]](http://docs.aws.amazon.com/zh_cn/codeartifact/latest/ug/images/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` 使用 `repo-C` 作为上游，并且 `repo-C` 还配置了 **npmjs.com** 作为外部连接；请参见下图。

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


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