

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

# 在存储库之间复制程序包
<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` 权限，目标存储库必须具有 `CopyPackageVersions` 权限，这些权限分配给 IAM 账户或复制程序包的用户。以下策略是使用 `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>

使用中的`copy-package-versions`命令 CodeArtifact 将一个或多个软件包版本从源存储库复制到同一域中的目标存储库。以下示例会将名为 `my-package` 的 npm 程序包的 6.0.2 和 4.0.0 版本从 `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 软件开发工具包，请在`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>

如果您指定的版本在源存储库中不存在，则复制会失败。如果源存储库中存在某些版本，而有些版本不存在，则所有版本都将无法复制。在以下示例中，源存储库中存在 `array-unique` npm 程序包的版本 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` 的输出中列出。

在以下示例中，源存储库 `repo-1` 中存在 npm 程序包 `array-unique` 的两个版本。目标存储库 `dest-repo` 中也存在版本 0.2.1，但不存在版本 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` 命令。

**注意**  
必须使用 `copy-package-versions` 指定 `--versions` 或 `--version-revisions` 参数。不能同时指定两者。

仅在源存储库中存在程序包 `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
```

以下示例复制程序包 `my-package` 的两个版本，即 0.3.2 和 0.3.13。仅当在源存储库中，`my-package` 的版本 0.3.2 具有修订 `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 标签和 API。 CopyPackageVersions](npm-tags.md#tags-and-cpv)