

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

# 在儲存庫之間複製套件
<a name="copy-package"></a>

您可以在 CodeArtifact 中將套件版本從一個儲存庫複製到另一個儲存庫。這對於套件提升工作流程或團隊或專案之間共用套件版本等案例很有幫助。來源和目的地儲存庫必須位於相同的網域中，才能複製套件版本。

## 複製套件所需的 IAM 許可
<a name="copypackageversions-iam-actions"></a>

若要在 CodeArtifact 中複製套件版本，呼叫使用者必須具有必要的 IAM 許可，且連接至來源和目的地儲存庫的資源型政策必須具有必要的許可。如需以資源為基礎的許可政策和 CodeArtifact 儲存庫的詳細資訊，請參閱 [儲存庫政策](repo-policies.md)。

呼叫 的使用者`copy-package-versions`必須擁有來源儲存庫的 `ReadFromRepository` 許可，以及目的地儲存庫的 `CopyPackageVersions`許可。

來源儲存庫必須擁有 `ReadFromRepository`許可，而目的地儲存庫必須擁有指派給 IAM 帳戶或使用者複製套件的 `CopyPackageVersions` 許可。下列政策是使用 `put-repository-permissions-policy`命令新增至來源儲存庫或目的地儲存庫的範例儲存庫政策。將 *111122223333* 取代為呼叫 的帳戶 ID`copy-package-versions`。

**注意**  
如果存在，呼叫 `put-repository-permissions-policy`將取代目前的儲存庫政策。您可以使用 `get-repository-permissions-policy`命令來查看政策是否存在，如需詳細資訊，請參閱 [讀取政策](repo-policies.md#reading-a-policy)。如果政策確實存在，您可能想要將這些許可新增至政策，而不是取代它。

**範例來源儲存庫許可政策**

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Action": [
                "codeartifact:ReadFromRepository"
            ],
            "Effect": "Allow",
            "Principal": {
                 "AWS": "arn:aws:iam::111122223333:root"
            },
            "Resource": "*"
        }
    ]
}
```

------

**範例目的地儲存庫許可政策**

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Action": [
                "codeartifact:CopyPackageVersions"
            ],
            "Effect": "Allow",
            "Principal": {
                 "AWS": "arn:aws:iam::111122223333:root"
            },
            "Resource": "*"
        }
    ]
}
```

------

## 複製套件版本
<a name="copy-package-versions"></a>

使用 CodeArtifact 中的 `copy-package-versions`命令，將一或多個套件版本從來源儲存庫複製到相同網域中的目的地儲存庫。下列範例會將名為 的 npm 套件版本 6.0.2 和 4.0.0 `my-package` 從`my_repo`儲存庫複製到`repo-2`儲存庫。

```
aws codeartifact copy-package-versions --domain my_domain --domain-owner 111122223333 --source-repository my_repo \
 --destination-repository repo-2 --package my-package --format npm \
 --versions 6.0.2 4.0.0
```

您可以在單一操作中複製相同套件名稱的多個版本。若要複製不同套件名稱的版本，您必須`copy-package-versions`針對每個套件名稱呼叫 。

先前的命令會產生下列輸出，假設兩個版本都可以成功複製。

```
{
   "successfulVersions": {
        "6.0.2": {
            "revision": "REVISION-1-SAMPLE-6C81EFF7DA55CC",
            "status": "Published"
        },
        "4.0.0": {
            "revision": "REVISION-1-SAMPLE-6C81EFF7DA55CC",
            "status": "Published"
        }
    },
    "failedVersions": {}
}
```

## 從上游儲存庫複製套件
<a name="copy-package-upstream"></a>

一般而言， `copy-package-versions`只會在 `--source-repository`選項指定的儲存庫中尋找要複製的版本。不過，您可以使用 `--include-from-upstream`選項，從來源儲存庫及其上游儲存庫複製版本。如果您使用 CodeArtifact SDK，請呼叫 `includeFromUpstream` 參數設為 true 的 `CopyPackageVersions` API。如需詳細資訊，請參閱[在 CodeArtifact 中使用上游儲存庫](repos-upstream.md)。

## 複製範圍 npm 套件
<a name="copying-a-scoped-npm-package"></a>

 若要複製範圍內的 npm 套件版本，請使用 `--namespace`選項來指定範圍。例如，若要複製套件 `@types/react`，請使用 `--namespace types`。使用 時，必須省略 `@`符號`--namespace`。

```
aws codeartifact copy-package-versions  --domain my_domain --domain-owner 111122223333 --source-repository repo-1 \
 --destination-repository repo-2 --format npm --namespace types \
 --package react --versions 0.12.2
```

## 複製 Maven 套件版本
<a name="copying-a-maven-package"></a>

若要在儲存庫之間複製 Maven 套件版本，請使用 `--namespace`選項傳遞 Maven 群組 ID，並使用 `--name`選項傳遞 Maven artifactID，以指定要複製的套件。例如，若要複製單一版本的 `com.google.guava:guava`：

```
 aws codeartifact copy-package-versions --domain my_domain --domain-owner 111122223333  \
 --source-repository my_repo --destination-repository repo-2 --format maven --namespace com.google.guava \
 --package guava --versions 27.1-jre
```

如果成功複製套件版本，輸出將類似於以下內容。

```
{
    "successfulVersions": {
        "27.1-jre": {
            "revision": "REVISION-1-SAMPLE-6C81EFF7DA55CC",
            "status": "Published"
        }
    },
    "failedVersions": {}
}
```

## 來源儲存庫中不存在的版本
<a name="versions-that-do-not-exist-in-the-source-repository"></a>

如果您指定的版本不存在於來源儲存庫中，複製將會失敗。如果來源儲存庫中存在某些版本，但有些版本不存在，則所有版本都將無法複製。在下列範例中，來源儲存庫中存在 npm `array-unique` 套件的 0.2.0 版，但 5.6.7 版不是：

```
aws codeartifact copy-package-versions --domain my_domain --domain-owner 111122223333 \
         --source-repository my_repo --destination-repository repo-2 --format npm \
         --package array-unique --versions 0.2.0 5.6.7
```

此案例中的輸出將類似於以下內容。

```
{
    "successfulVersions": {},
    "failedVersions": {
        "0.2.0": {
            "errorCode": "SKIPPED",
            "errorMessage": "Version 0.2.0 was skipped"
        },
        "5.6.7": {
            "errorCode": "NOT_FOUND",
            "errorMessage": "Could not find version 5.6.7"
        }
    }
}
```

`SKIPPED` 錯誤碼用於表示版本未複製到目的地儲存庫，因為無法複製另一個版本。

## 已存在於目的地儲存庫的版本
<a name="versions-that-already-exist-in-the-destination-repository"></a>

 當套件版本複製到已存在的儲存庫時，CodeArtifact 會比較兩個儲存庫中的套件資產和套件版本層級中繼資料。

 如果來源和目的地儲存庫中的套件版本資產和中繼資料相同，則不會執行複本，但操作會被視為成功。這表示 `copy-package-versions`是等冪的。發生這種情況時，來源和目的地儲存庫中已存在的版本將不會列在 的輸出中`copy-package-versions`。

在下列範例中，來源儲存庫 中`array-unique`存在兩個版本的 npm 套件`repo-1`。版本 0.2.1 也存在於目的地儲存庫中，`dest-repo`而版本 0.2.0 則不存在。

```
aws codeartifact copy-package-versions --domain my_domain --domain-owner 111122223333 \
         --source-repository my_repo --destination-repository repo-2 --format npm --package array-unique \
         --versions 0.2.1 0.2.0
```

此案例中的輸出將類似於以下內容。

```
{
    "successfulVersions": {
        "0.2.0": {
            "revision": "Yad+B1QcBq2kdEVrx1E1vSfHJVh8Pr61hBUkoWPGWX0=",
            "status": "Published"
        }
    },
    "failedVersions": {}
}
```

0.2.0 版已列在 中，`successfulVersions`因為它已成功從來源複製到目的地儲存庫。輸出中不會顯示 0.2.1 版，因為它已存在於目的地儲存庫中。

 如果來源和目的地儲存庫中的套件版本資產或中繼資料不同，複製操作將會失敗。您可以使用 `--allow-overwrite` 參數來強制覆寫。

如果某些版本存在於目的地儲存庫中，而有些版本不存在，則所有版本將無法複製。在下列範例中，來源和目的地儲存庫中都存在 `array-unique` npm 套件的 0.3.2 版，但套件版本的內容不同。版本 0.2.1 存在於來源儲存庫中，但目的地不存在。

```
aws codeartifact copy-package-versions --domain my_domain --domain-owner 111122223333 \
         --source-repository my_repo --destination-repository repo-2 --format npm --package array-unique \
         --versions 0.3.2 0.2.1
```

此案例中的輸出將類似於以下內容。

```
{
    "successfulVersions": {},
    "failedVersions": {
        "0.2.1": {
            "errorCode": "SKIPPED",
            "errorMessage": "Version 0.2.1 was skipped"
        },
        "0.3.2": {
            "errorCode": "ALREADY_EXISTS",
            "errorMessage": "Version 0.3.2 already exists"
        }
    }
}
```

版本 0.2.1 會標示為 ，`SKIPPED`因為它未複製到目的地儲存庫。因為 0.3.2 版的複本已存在於目的地儲存庫中，但在來源和目的地儲存庫中不同，所以未複製。

## 指定套件版本修訂
<a name="specify-package-version-revision"></a>

 套件版本修訂是一種字串，可指定套件版本的特定資產和中繼資料集。您可以指定套件版本修訂，以複製處於特定狀態的套件版本。若要指定套件版本修訂，請使用 `--version-revisions` 參數將一或多個逗號分隔的套件版本和套件版本修訂對傳遞至 `copy-package-versions`命令。

**注意**  
您必須使用 指定 `--versions`或 `--version-revisions` 參數`copy-package-versions`。您不能同時指定兩者。

下列範例只會在套件版本修訂版 的來源儲存庫中存在 `my-package` 0.3.2 版的套件時複製`REVISION-1-SAMPLE-6C81EFF7DA55CC`套件。

```
aws codeartifact copy-package-versions --domain my_domain --domain-owner 111122223333 --source-repository repo-1 \
 --destination-repository repo-2 --format npm --namespace my-namespace \
 --package my-package --version-revisions 0.3.2=REVISION-1-SAMPLE-6C81EFF7DA55CC
```

下列範例會複製套件 0`my-package`.3.2 和 0.3.13 的兩個版本。只有當 的來源儲存庫 0.3.2 版具有`my-package`修訂版 `REVISION-1-SAMPLE-6C81EFF7DA55CC`且 0.3.13 版具有修訂版 時，複製才會成功`REVISION-2-SAMPLE-55C752BEE772FC`。

```
aws codeartifact copy-package-versions --domain my_domain --domain-owner 111122223333 --source-repository repo-1 \
 --destination-repository repo-2 --format npm --namespace my-namespace \
 --package my-package --version-revisions 0.3.2=REVISION-1-SAMPLE-6C81EFF7DA55CC,0.3.13=REVISION-2-SAMPLE-55C752BEE772FC
```

 若要尋找套件版本的修訂，請使用 `describe-package-version`或 `list-package-versions`命令。

 如需詳細資訊，請參閱 *CodeArtifact API 參考*中的 [套件版本修訂](codeartifact-concepts.md#welcome-concepts-package-version-revision)和 [CopyPackageVersion](https://docs.aws.amazon.com/codeartifact/latest/APIReference/API_CopyPackageVersions.html)。

## 複製 npm 套件
<a name="copying-npm-packages"></a>

 如需使用 npm 套件`copy-package-versions`之行為的詳細資訊，請參閱 [npm 標籤和 CopyPackageVersions API](npm-tags.md#tags-and-cpv)。