

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用上游儲存庫請求套件版本
<a name="repo-upstream-behavior"></a>

 當用戶端 （例如 npm) 從名為 且具有多個上游儲存庫`my_repo`的 CodeArtifact 儲存庫請求套件版本時，可能會發生下列情況：
+  如果 `my_repo`包含請求的套件版本，則會傳回給用戶端。
+  如果 `my_repo` 不包含請求的套件版本，CodeArtifact 會在 `my_repo`的上游儲存庫中尋找它。如果找到套件版本，則會將其參考複製到 `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_tw/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-B`以及從 `repo-C`取得的套件版本`repo-A`。

![\[簡單的上游儲存庫圖表顯示三個鏈結在一起的儲存庫。\]](http://docs.aws.amazon.com/zh_tw/codeartifact/latest/ug/images/upstream-chaining.png)


 當套件管理員連線至儲存庫`repo-A`並從儲存庫 擷取套件版本時`repo-C`，套件版本將不會保留在儲存庫 中`repo-B`。套件版本只會保留在最下游的儲存庫中，在此範例中為 `repo-A`。它不會保留在任何中繼儲存庫中。對於較長的鏈結也是如此；例如，如果有四個儲存庫 `repo-A`、`repo-C`、 `repo-B``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_tw/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`因為這是中繼儲存庫。