

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

# 在 CodeArtifact 中使用程序包组
<a name="package-groups"></a>

*程序包组* 可用于使用程序包格式、程序包命名空间和程序包名称，将配置应用于与定义的模式相匹配的多个程序包。您可以使用程序包组更方便地为多个程序包配置程序包来源控制。程序包来源控制用于阻止或允许摄取或发布新的程序包版本，从而防止用户受到称为依赖项替换攻击的恶意行为的侵害。

CodeArtifact 中的每个域都会自动包含一个根程序包组。此根程序包组 `/*` 包含所有程序包，默认情况下允许程序包版本从所有源类型进入域中的存储库。可以修改根程序包组，但不能将其删除。

在创建新程序包组或删除现有程序包组时，“程序包组配置”功能以最终一致的方式运行。这意味着，创建或删除程序包组时，来源控制将应用于预期的关联程序包，但由于最终一致的行为，会存在一定的延迟。实现最终一致性所需的时间取决于域中程序包组的数量以及域中程序包的数量。创建或删除程序包组后，来源控制可能短时间内不会立即反映在关联的程序包上。

此外，对程序包组来源控制的更新几乎立即生效。与创建或删除程序包组不同，对现有程序包组来源控制的更改会立即反映在关联的程序包上，而不会产生同样的延迟。

这些主题包含有关 AWS CodeArtifact 中程序包组的信息。

**Topics**
+ [创建程序包组](create-package-group.md)
+ [查看或编辑程序包组](view-edit-package-group.md)
+ [删除程序包组](delete-package-group.md)
+ [程序包组来源控制](package-group-origin-controls.md)
+ [程序包组定义语法和匹配行为](package-group-definition-syntax-matching-behavior.md)
+ [标记程序包组](package-group-tags.md)

# 创建程序包组
<a name="create-package-group"></a>

您可以使用 CodeArtifact 控制台、AWS Command Line Interface（AWS CLI）或 CloudFormation 来创建程序包组。有关使用 CloudFormation 管理 CodeArtifact 程序包组的更多信息，请参阅[使用 AWS CloudFormation 创建 CodeArtifact 资源](cloudformation-codeartifact.md)。

## 创建程序包组（控制台）
<a name="create-package-group-console"></a>

1. 打开 AWS CodeArtifact 控制台，网址为：[https://console.aws.amazon.com/codesuite/codeartifact/home](https://console.aws.amazon.com/codesuite/codeartifact/home)。

1. 在导航窗格中，选择**域**，然后选择要在其中创建程序包组的域。

1. 选择**程序包组**，然后选择**创建程序包组**。

1. 在**程序包组定义**中，输入您的程序包组的定义。程序包组定义决定了哪些程序包与该组关联。您可以使用文本手动输入程序包组定义，也可以使用可视化模式进行选择，此时将自动创建程序包组定义。

1. 要使用可视化模式创建程序包组定义，请执行以下操作：

   1. 选择**可视化**以切换到可视化模式。

   1. 在**程序包格式**中，选择要与该组关联的程序包的格式。

   1. 在**命名空间（范围）**中，选择要匹配的命名空间标准。
      + **等于**：与指定的命名空间完全匹配。如果选择此项，请输入要匹配的命名空间。
      + **空白**：匹配没有命名空间的程序包。
      + **以单词开头**：匹配以指定单词开头的命名空间。如果选择此项，请输入要匹配的前缀词。有关单词和单词边界的更多信息，请参阅[单词、单词边界和前缀匹配](package-group-definition-syntax-matching-behavior.md#package-group-word-boundary-prefix)。
      + **全部**：匹配所有命名空间中的程序包。

   1. 如果选择了**等于**、**空白**或**以单词开头**，则在**程序包名称**中，选择要匹配的程序包名称标准。
      + **完全等于**：与指定的程序包名称完全匹配。如果选择此项，请输入要匹配的程序包名称。
      + **以前缀开头**：匹配以指定前缀开头的程序包。
      + **以单词开头**：匹配以指定单词开头的程序包。如果选择此项，请输入要匹配的前缀词。有关单词和单词边界的更多信息，请参阅[单词、单词边界和前缀匹配](package-group-definition-syntax-matching-behavior.md#package-group-word-boundary-prefix)。
      + **全部**：匹配所有程序包。

   1. 选择**下一步**，检查定义。

1. 要使用文本输入程序包组定义，请执行以下操作：

   1. 选择**文本**以切换到文本模式。

   1. 在**程序包组定义**中，输入程序包组定义。有关程序包组定义语法的更多信息，请参阅[程序包组定义语法和匹配行为](package-group-definition-syntax-matching-behavior.md)。

   1. 选择**下一步**，检查定义。

1. 在**查看定义**中，根据先前提供的定义，查看将包含在新程序包组中的程序包。检查完之后，选择**下一步**。

1. 在**程序包组信息**中，（可选）添加程序包组的描述和联系人电子邮件地址。选择**下一步**。

1. 在**程序包来源控制**中，配置要应用于该组中程序包的来源控制。有关程序包组来源控制的更多信息，请参阅[程序包组来源控制](package-group-origin-controls.md)。

1. 选择**创建程序包组**。

## 创建程序包组（AWS CLI）
<a name="create-package-group-cli"></a>

使用 `create-package-group` 命令在您的域中创建程序包组。对于 `--package-group` 选项，请输入程序包组定义，以确定哪些程序包与该组关联。有关程序包组定义语法的更多信息，请参阅[程序包组定义语法和匹配行为](package-group-definition-syntax-matching-behavior.md)。

如果还没有配置 AWS CLI，请按照[使用进行设置 AWS CodeArtifact](get-set-up-for-codeartifact.md)中的步骤进行配置。

```
aws codeartifact create-package-group \
         --domain my_domain \
         --package-group '/nuget/*' \
         --domain-owner 111122223333 \
         --contact-info contact@email.com \
         --description "a new package group" \
         --tags key=key1,value=value1
```

# 查看或编辑程序包组
<a name="view-edit-package-group"></a>

您可以使用 CodeArtifact 控制台或 AWS Command Line Interface（AWS CLI）查看所有程序包组的列表，查看特定程序包组的详细信息，或者编辑程序包组的详细信息或配置。

## 查看或编辑程序包组（控制台）
<a name="view-edit-package-group-console"></a>

1. 打开 AWS CodeArtifact 控制台，网址为：[https://console.aws.amazon.com/codesuite/codeartifact/home](https://console.aws.amazon.com/codesuite/codeartifact/home)。

1. 在导航窗格中，选择**域**，然后选择包含要查看或编辑的程序包组的域。

1. 选择**程序包组**，然后选择要查看或编辑的程序包组。

1. 在**详细信息**中，查看有关该程序包组的信息，包括其父组、描述、ARN、联系人电子邮件地址和程序包来源控制。

1. 在**子组**中，查看以该组为父组的程序包组的列表。此列表中的程序包组可以继承该程序包组的设置。有关更多信息，请参阅 [程序包组层次结构和模式特异性](package-group-definition-syntax-matching-behavior.md#package-group-hierarchy-pattern-specificity)。

1. 在**程序包**中，根据程序包组定义查看属于该程序包组的程序包。在**强度**列中，可以看到程序包关联的强度。有关更多信息，请参阅 [程序包组层次结构和模式特异性](package-group-definition-syntax-matching-behavior.md#package-group-hierarchy-pattern-specificity)。

1. 要编辑程序包组信息，请选择**编辑程序包组**。

   1. 在**信息**中，更新程序包组的描述或联系信息。无法编辑程序包组的定义。

   1. 在**程序包组来源控制**中，更新程序包组的来源控制设置，这些设置决定了关联的程序包如何进入域中的存储库。有关更多信息，请参阅 [程序包组来源控制](package-group-origin-controls.md)。

## 查看或编辑程序包组（AWS CLI）
<a name="view-edit-package-group-cli"></a>

借助 AWS CLI 使用以下命令查看或编辑程序包组。如果还没有配置 AWS CLI，请按照[使用进行设置 AWS CodeArtifact](get-set-up-for-codeartifact.md)中的步骤进行配置。

要查看域中的所有程序包组，请使用 `list-package-groups` 命令。

```
aws codeartifact list-package-groups \
         --domain my_domain \
         --domain-owner 111122223333
```

要查看有关程序包组的详细信息，请使用 `describe-package-group` 命令。有关程序包组定义的更多信息，请参阅[程序包组定义语法和示例](package-group-definition-syntax-matching-behavior.md#package-group-definition-syntax-examples)。

```
aws codeartifact describe-package-group \
         --domain my_domain \
         --domain-owner 111122223333 \
         --package-group '/nuget/*'
```

要查看程序包组的子程序包组，请使用 `list-sub-package-groups` 命令。

```
aws codeartifact list-sub-package-groups \
         --domain my_domain \
         --domain-owner 111122223333 \
         --package-group '/nuget/*' \
```

要查看与程序包关联的程序包组，请使用 `get-associated-package-group` 命令。NuGet、Python 和 Swift 程序包格式必须使用规范化的程序包名和命名空间。有关如何规范程序包名称和命名空间的更多信息，请参阅 [NuGet](nuget-name-normalization.md)、[Python](python-name-normalization.md) 和 [Swift](swift-name-normalization.md) 名称规范化文档。

```
aws codeartifact get-associated-package-group \
         --domain my_domain \
         --domain-owner 111122223333 \
         --format npm \
         --package packageName \
         --namespace scope
```

要编辑程序包组，请使用 `update-package-group` 命令。此命令用于更新程序包组的联系信息或描述。有关程序包组来源控制设置以及如何添加或编辑这些设置的信息，请参阅[程序包组来源控制](package-group-origin-controls.md)。有关程序包组定义的更多信息，请参阅[程序包组定义语法和示例](package-group-definition-syntax-matching-behavior.md#package-group-definition-syntax-examples)

```
aws codeartifact update-package-group \
         --domain my_domain \
         --package-group '/nuget/*' \
         --domain-owner 111122223333 \
         --contact-info contact@email.com \
         --description "updated package group description"
```

# 删除程序包组
<a name="delete-package-group"></a>

您可以使用 CodeArtifact 控制台或 AWS Command Line Interface（AWS CLI）来删除程序包组。

删除程序包组时，请注意以下行为：
+ 无法删除根程序包组 `/*`。
+ 不会删除与该程序包组关联的程序包和程序包版本。
+ 删除程序包组后，直接子程序包组将成为该程序包组的直接父程序包组的子组。因此，如果任何子组从父组继承任何设置，这些设置可能会发生变化。

## 删除程序包组（控制台）
<a name="delete-package-group-console"></a>

1. 打开 AWS CodeArtifact 控制台，网址为：[https://console.aws.amazon.com/codesuite/codeartifact/home](https://console.aws.amazon.com/codesuite/codeartifact/home)。

1. 在导航窗格中，选择**域**，然后选择包含要查看或编辑的程序包组的域。

1. 选择**程序包组**。

1. 选择要删除的程序包组，然后选择**删除**。

1. 在字段中输入 delete，然后选择**删除**。

## 删除程序包组（AWS CLI）
<a name="delete-package-group-cli"></a>

要删除程序包组，请使用 `delete-package-group` 命令。

```
aws codeartifact delete-package-group \
         --domain my_domain \
         --domain-owner 111122223333 \
         --package-group '/nuget/*'
```

# 程序包组来源控制
<a name="package-group-origin-controls"></a>

程序包来源控制用于配置程序包版本进入域的方式。您可以在程序包组上设置来源控制，以配置与该程序包组关联的每个程序包的版本如何进入域中的指定存储库。

程序包组来源控制设置包括以下内容：
+ [限制设置](#package-group-origin-control-settings-restrictions)：这些设置定义了程序包是否可从发布、内部上游或外部公有存储库进入 CodeArtifact 中的存储库。
+ [允许存储库列表](#package-group-origin-control-settings-repositories)：每个限制设置均可设为允许特定的存储库。如果将某个限制设置设为允许特定存储库，则该限制将具有相应的允许存储库列表。

**注意**  
程序包组的来源控制设置与单个程序包的来源控制设置略有不同。有关程序包的来源控制设置的更多信息，请参阅[程序包来源控制设置](package-origin-controls.md#package-origin-control-settings)。

## 限制设置
<a name="package-group-origin-control-settings-restrictions"></a>

程序包组来源控制设置的限制设置决定了与该组关联的程序包进入域中存储库的方式。

### 发布
<a name="package-group-origin-control-settings-restrictions-publish"></a>

`PUBLISH` 设置配置了是否可以使用程序包管理器或类似工具将程序包版本直接发布到域中的任何存储库。
+ **允许**：程序包版本可以直接发布到所有存储库。
+ **阻止**：程序包版本不可以直接发布到任何存储库。
+ **ALLOW\$1SPECIFIC\$1REPOSITORIES**：程序包版本只能直接发布到允许发布的存储库列表中指定的存储库。
+ **继承**：`PUBLISH` 设置继承自第一个父程序包组，但其设置不是 `INHERIT`。

### EXTERNAL\$1UPSTREAM
<a name="package-group-origin-control-settings-restrictions-ext-upstream"></a>

`EXTERNAL_UPSTREAM` 设置配置了在程序包管理器发出请求时，是否可从外部公有存储库中摄取程序包版本。有关支持的外部存储库的列表，请参阅[支持的外部连接存储库](external-connection.md#supported-public-repositories)。
+ **允许**：任何程序包版本都可以通过外部连接从公有来源摄取到所有存储库中。
+ **阻止**：程序包版本不能通过外部连接从公有来源摄取到任何存储库中。
+ **ALLOW\$1SPECIFIC\$1REPOSITORIES**：程序包版本只能从公有来源摄取到外部上游的允许存储库列表中指定的存储库中。
+ **继承**：`EXTERNAL_UPSTREAM` 设置继承自第一个父程序包组，但其设置不是 `INHERIT`。

### INTERNAL\$1UPSTREAM
<a name="package-group-origin-control-settings-restrictions-int-upstream"></a>

`INTERNAL_UPSTREAM` 设置配置了在程序包管理器发出请求时，是否可从同一 CodeArtifact 域的内部上游存储库中保留程序包版本。
+ **允许**：任何程序包版本都可以从配置为上游存储库的其他 CodeArtifact 存储库中保留。
+ **阻止**：不能从配置为上游存储库的其他 CodeArtifact 存储库中保留程序包版本。
+ **ALLOW\$1SPECIFIC\$1REPOSITORIES**：程序包版本只能从配置为上游存储库的其他 CodeArtifact 存储库保留到内部上游的允许存储库列表中指定的存储库中。
+ **继承**：`INTERNAL_UPSTREAM` 设置继承自第一个父程序包组，但其设置不是 `INHERIT`。

## 允许存储库列表
<a name="package-group-origin-control-settings-repositories"></a>

当限制设置配置为 `ALLOW_SPECIFIC_REPOSITORIES` 时，程序包组将包含随附的允许存储库列表，其中包含该限制设置允许使用的存储库列表。因此，一个程序包组包含 0 到 3 个允许存储库列表，每个配置为 `ALLOW_SPECIFIC_REPOSITORIES` 的设置对应一个列表。

将存储库添加到程序包组的允许存储库列表时，必须指定将其添加到哪个允许存储库列表中。

可能的允许存储库列表如下：
+ `EXTERNAL_UPSTREAM`：允许或阻止从已添加存储库中的外部存储库中摄取程序包版本。
+ `INTERNAL_UPSTREAM`：允许或阻止从已添加存储库中的另一个 CodeArtifact 存储库中提取程序包版本。
+ `PUBLISH`：允许或阻止将程序包版本从程序包管理器直接发布到已添加的存储库。

## 编辑程序包组来源控制设置
<a name="package-group-edit-origin-controls"></a>

要为程序包组添加或编辑来源控制，请执行以下程序中的步骤。有关程序包组来源控制设置的信息，请参阅[限制设置](#package-group-origin-control-settings-restrictions)和[允许存储库列表](#package-group-origin-control-settings-repositories)。

**添加或编辑程序包组来源控制（CLI）**

1. 如果还没有配置 AWS CLI，请按照[使用进行设置 AWS CodeArtifact](get-set-up-for-codeartifact.md)中的步骤进行配置。

1. 使用 `update-package-group-origin-configuration` 命令来添加或编辑程序包来源控制。
   + 对于 `--domain`，输入要更新的程序包组所在的 CodeArtifact 域。
   + 对于 `--domain-owner`，输入域所有者的账号。
   + 对于 `--package-group`，输入要更新的程序包组。
   + 对于 `--restrictions`，输入表示来源控制限制的键值对。
   + 对于 `--add-allowed-repositories`，输入一个 JSON 对象，该对象包含限制类型，并包含要添加到该限制的相应允许存储库列表中的存储库名称。
   + 对于 `--remove-allowed-repositories`，输入一个 JSON 对象，该对象包含限制类型，并包含要从该限制的相应允许存储库列表中删除的存储库名称。

   ```
   aws codeartifact update-package-group-origin-configuration \
      --domain my_domain \
      --domain-owner 111122223333 \
      --package-group '/nuget/*' \
      --restrictions INTERNAL_UPSTREAM=ALLOW_SPECIFIC_REPOSITORIES \
      --add-allowed-repositories originRestrictionType=INTERNAL_UPSTREAM,repositoryName=my_repo \
      --remove-allowed-repositories originRestrictionType=INTERNAL_UPSTREAM,repositoryName=my_repo2
   ```

   以下示例在一个命令中添加了多个限制和多个存储库。

   ```
   aws codeartifact update-package-group-origin-configuration \
      --domain my_domain \
      --domain-owner 111122223333 \
      --package-group '/nuget/*' \
      --restrictions PUBLISH=BLOCK,EXTERNAL_UPSTREAM=ALLOW_SPECIFIC_REPOSITORIES,INTERNAL_UPSTREAM=ALLOW_SPECIFIC_REPOSITORIES \
      --add-allowed-repositories originRestrictionType=INTERNAL_UPSTREAM,repositoryName=my_repo originRestrictionType=INTERNAL_UPSTREAM,repositoryName=my_repo2 \
      --remove-allowed-repositories originRestrictionType=INTERNAL_UPSTREAM,repositoryName=my_repo2
   ```

## 程序包组来源控制配置示例
<a name="package-group-origin-control-examples"></a>

以下示例显示了常见程序包管理场景的程序包来源控制配置。

### 允许发布具有私有名称的程序包，但不允许摄取此类程序包
<a name="package-group-origin-control-examples-one"></a>

这种情况很可能是程序包管理中的常见场景：
+ 允许将具有私有名称的程序包从程序包管理器发布到您域中的存储库，并阻止从外部公有存储库将这些程序包摄取到您域中的存储库。
+ 允许从外部公有存储库将所有其他程序包摄取到您域中的存储库，并阻止通过程序包管理器将这些程序包发布到您域中的存储库。

为此，应使用一种包含私有名称以及**发布：允许**、**EXTERNAL\$1UPSTREAM：阻止**和 **INTERNAL\$1UPSTREAM：允许**的来源设置的模式来配置程序包组。这将确保可以直接发布具有私有名称的程序包，但不能从外部存储库中摄取此类程序包。

以下 AWS CLI 命令使用与所需行为相匹配的来源限制设置来创建和配置程序包组：

要创建程序包组，请执行以下操作：

```
aws codeartifact create-package-group \
   --domain my_domain \
   --package-group /npm/space/anycompany~ \
   --domain-owner 111122223333 \
   --contact-info contact@email.com | URL \
   --description "my package group"
```

要更新程序包组的来源配置，请执行以下操作：

```
aws codeartifact update-package-group-origin-configuration \
   --domain my_domain \
   --domain-owner 111122223333 \
   --package-group '/npm/space/anycompany~' \
   --restrictions PUBLISH=ALLOW,EXTERNAL_UPSTREAM=BLOCK,INTERNAL_UPSTREAM=ALLOW
```

### 允许通过一个存储库从外部存储库中摄取
<a name="package-group-origin-control-examples-ingestion-one-repo"></a>

在这种情况下，您的域有多个存储库。在这些存储库中，`repoA` 与 `repoB` 建立了上游连接，而后者又与公有存储库 `npmjs.com` 建立了外部连接，如下所示：

`repoA --> repoB --> npmjs.com`

您想允许从特定程序包组中摄取程序包，将 `/npm/space/anycompany~` 从 `npmjs.com` 摄取到 `repoA` 中，但只通过 `repoB` 实现。您还想阻止将与程序包组关联的程序包摄取到您域中的任何其他存储库中，并阻止通过程序包管理器直接发布程序包。为此，按如下方式创建和配置程序包组：

**发布：阻止**、**EXTERNAL\$1UPSTREAM：ALLOW\$1SPECIFIC\$1REPOSITORIES** 和 **INTERNAL\$1UPSTREAM：ALLOW\$1SPECIFIC\$1REPOSITORIES** 的来源限制设置。

添加到相应的允许存储库列表中的 `repoA` 和 `repoB`：
+ `repoA` 应添加到 `INTERNAL_UPSTREAM` 列表中，因为它将从其内部上游 `repoB` 获取程序包。
+ `repoB` 应添加到 `EXTERNAL_UPSTREAM` 列表中，因为它将从外部存储库 `npmjs.com` 获取程序包。

以下 AWS CLI 命令使用与所需行为相匹配的来源限制设置来创建和配置程序包组：

要创建程序包组，请执行以下操作：

```
aws codeartifact create-package-group \
   --domain my_domain \
   --package-group /npm/space/anycompany~ \
   --domain-owner 111122223333 \
   --contact-info contact@email.com | URL \
   --description "my package group"
```

要更新程序包组的来源配置，请执行以下操作：

```
aws codeartifact update-package-group-origin-configuration \
   --domain my_domain \
   --domain-owner 111122223333 \
   --package-group /npm/space/anycompany~ \
   --restrictions PUBLISH=BLOCK,EXTERNAL_UPSTREAM=ALLOW_SPECIFIC_REPOSITORIES,INTERNAL_UPSTREAM=ALLOW_SPECIFIC_REPOSITORIES \
   --add-allowed-repositories originRestrictionType=INTERNAL_UPSTREAM,repositoryName=repoA originRestrictionType=EXTERNAL_UPSTREAM,repositoryName=repoB
```

## 程序包组来源控制设置如何与程序包来源控制设置交互
<a name="package-group-origin-control-settings-interaction"></a>

由于程序包具有来源控制设置，其关联的程序包组也具有来源控制设置，因此了解这两种不同设置的彼此交互方式非常重要。有关设置之间交互的信息，请参阅[程序包来源控制如何与程序包组来源控制交互](package-origin-controls.md#package-origin-controls-interaction-package-groups)。

# 程序包组定义语法和匹配行为
<a name="package-group-definition-syntax-matching-behavior"></a>

本主题包含有关定义程序包组、模式匹配行为、程序包关联强度和程序包组层次结构的信息。

**Contents**
+ [程序包组定义语法和示例](#package-group-definition-syntax-examples)
  + [程序包组定义和规范化](#package-group-definition-syntax-examples-normalization)
  + [程序包组定义中的命名空间](#package-group-definition-syntax-examples-namespaces)
+ [程序包组层次结构和模式特异性](#package-group-hierarchy-pattern-specificity)
+ [单词、单词边界和前缀匹配](#package-group-word-boundary-prefix)
+ [区分大小写](#package-group-case-sensitivity)
+ [强匹配和弱匹配](#package-group-strong-and-weak-match)
+ [其他变体](#package-group-additional-variations)

## 程序包组定义语法和示例
<a name="package-group-definition-syntax-examples"></a>

 定义程序包组的模式语法严格遵循程序包路径的格式。程序包路径是根据程序包的坐标组件（格式、命名空间和名称）创建的，方法是在开头添加正斜杠，然后用正斜杠分隔每个组件。例如，命名空间 *space* 中名为 *anycompany-ui-components* 的 npm 程序包的程序包路径为 */npm/space/anycompany-ui-components*。

程序包组模式遵循与程序包路径相同的结构，不同之处在于省略了未指定为组定义一部分的组件，并且该模式以一个后缀结尾。包含的后缀决定了模式的匹配行为，如下所示：
+ `$` 后缀将与完整的程序包坐标匹配。
+ `~` 后缀将与一个前缀匹配。
+ `*` 后缀将与先前定义的组件的所有值匹配。

以下是每种允许组合的示例模式：

1. 所有程序包格式：`/*`

1. 特定程序包格式：`/npm/*`

1. 程序包格式和命名空间前缀：`/maven/com.anycompany~`

1. 程序包格式和命名空间：`/npm/space/*`

1. 程序包格式、命名空间和名称前缀：`/npm/space/anycompany-ui~`

1. 程序包格式、命名空间和名称：`/maven/org.apache.logging.log4j/log4j-core$`

如以上示例所示，`~` 后缀添加到命名空间或名称的末尾以表示前缀匹配，当用于匹配路径中下一个组件的所有值（所有格式、所有命名空间或所有名称）时，`*` 位于正斜杠之后。

### 程序包组定义和规范化
<a name="package-group-definition-syntax-examples-normalization"></a>

CodeArtifact 对 NuGet、Python 和 Swift 程序包名称进行规范化，并对 Swift 程序包命名空间进行规范化，然后存储它们。CodeArtifact 在将程序包与程序包组定义进行匹配时使用这些规范化名称。因此，包含采用这些格式的命名空间或名称的程序包组必须使用规范化的命名空间和名称。有关如何规范程序包名称和命名空间的更多信息，请参阅 [NuGet](nuget-name-normalization.md)、[Python](python-name-normalization.md) 和 [Swift](swift-name-normalization.md) 名称规范化文档。

### 程序包组定义中的命名空间
<a name="package-group-definition-syntax-examples-namespaces"></a>

对于没有命名空间的程序包或程序包格式（Python 和 NuGet），程序包组不得包含命名空间。这些程序包组的程序包组定义包含一个空白的命名空间部分。例如，名为 *requests* 的 Python 程序包的路径为 */python//requests*。

对于带有命名空间的程序包或程序包格式（Maven、通用和 Swift），如果包含程序包名称，则必须包含命名空间。对于 Swift 程序包格式，将使用规范化的程序包命名空间。有关如何规范 Swift 程序包命名空间的更多信息，请参阅 [Swift 程序包名称和命名空间规范化](swift-name-normalization.md)。

## 程序包组层次结构和模式特异性
<a name="package-group-hierarchy-pattern-specificity"></a>

“属于”某个程序包组或与之“关联”的程序包是指其程序包路径与该组的模式匹配，但与更具体组的模式不匹配的程序包。例如，给定程序包组 `/npm/*` 和 `/npm/space/*`，程序包路径 */npm//react* 与第一个组（`/npm/*`）关联，而 */npm/space/aui.components* 和 */npm/space/amplify-ui-core* 与第二个组（`/npm/space/*`）关联。尽管一个程序包可能与多个组匹配，但每个程序包仅与一个组关联（即最具体的匹配），只有这个组的配置才适用于该程序包。

当一个程序包路径与多个模式匹配时，可以将“更具体”的模式视为最长的匹配模式。或者，更具体的模式是与程序包（该程序包与不太具体的模式匹配）的适当子集匹配的模式。在之前的示例中，每个与 `/npm/space/*` 匹配的程序包也都与 `/npm/*` 匹配，但反之则不成立，这使得 `/npm/space/*` 模式更具体，因为它是 `/npm/*` 的一个适当子集。由于一个组是另一个组的子集，因此它会创建一个层次结构，其中 `/npm/space/*` 是父组 `/npm/*` 的子组。

尽管只有最具体的程序包组的配置适用于程序包，但可以将该组配置为继承其父组的配置。

## 单词、单词边界和前缀匹配
<a name="package-group-word-boundary-prefix"></a>

讨论前缀匹配之前，我们先定义一些关键术语：
+ *单词*：一个字母或数字，后跟零个或多个字母、数字或标记字符（例如重音符号、变音符号等）。
+ 当到达非单词字符时，**单词边界位于单词的末尾。非单词字符是标点符号，例如 `.`、`-` 和 `_`。

具体而言，单词的正则表达式模式是 `[\p{L}\p{N}][\p{L}\p{N}\p{M}]*`，可以分解如下：
+ `\p{L}` 代表任何字母。
+ `\p{N}` 代表任意数字。
+ `\p{M}` 代表任何标记字符，例如重音符号、变音符号等。

因此，`[\p{L}\p{N}]` 代表一个数字或字母，`[\p{L}\p{N}\p{M}]*` 代表零个或多个字母、数字或标记字符，而单词边界位于此正则表达式模式的每个匹配项的末尾。

**注意**  
单词边界匹配基于“单词”的这一定义，而不基于字典中定义的单词，也不基于 CameCase。例如，`oneword` 或 `OneWord` 中没有单词边界。

定义了单词和单词边界后，我们可以用它们来描述 CodeArtifact 中的前缀匹配。为了表示单词边界上的前缀匹配，在单词字符后面使用匹配字符（`~`）。例如，模式 `/npm/space/foo~` 与程序包路径 `/npm/space/foo` 和 `/npm/space/foo-bar` 匹配，但与 `/npm/space/food` 或 `/npm/space/foot` 不匹配。

非单词字符后面需要使用通配符（`*`），而不是 `~`，例如在模式 `/npm/*` 中。

## 区分大小写
<a name="package-group-case-sensitivity"></a>

程序包组定义区分大小写，这意味着仅在大小写方面有所不同的模式可作为单独的程序包组存在。例如，用户可以为 npm 公有注册表上存在的三个不同的程序包（*AsyncStorage*、*asyncStorage* 和 *asyncstorage*，它们仅在大小写方面有所不同）创建单独的程序包组，其模式分别为 `/npm//AsyncStorage$`、`/npm//asyncStorage$` 和 `/npm//asyncstorage$`。

虽然大小写很重要，但如果程序包的模式变体只是大小写不同，CodeArtifact 仍会将程序包与程序包组关联。如果用户创建了 `/npm//AsyncStorage$` 程序包组，而没有创建上面显示的其他两个组，则名称 *AsyncStorage* 的所有大小写变体（包括 *asyncStorage* 和 *asyncstorage*）都将与该程序包组关联。但是，如下一节[强匹配和弱匹配](#package-group-strong-and-weak-match)所述，这些变体的处理方式将与 *AsyncStorage* 不同，后者与模式完全匹配。

## 强匹配和弱匹配
<a name="package-group-strong-and-weak-match"></a>

上一节[区分大小写](#package-group-case-sensitivity)中的信息说明程序包组区分大小写，接着又解释它们不区分大小写。这是因为 CodeArtifact 中的程序包组定义具有强匹配（或精确匹配）和弱匹配（或变体匹配）的概念。强匹配是指程序包与模式完全匹配，无任何变体。弱匹配是指程序包与模式的变体（例如不同的字母大小写）匹配。弱匹配行为可防止作为程序包组模式变体的程序包汇总到更通用的程序包组。当某个程序包是最具体匹配组模式的变体（弱匹配）时，此程序包便与该组关联，但此程序包会被阻止，而不会应用该组的来源控制配置，从而防止此程序包的任何新版本从上游提取或发布。这种行为降低了由于名称几乎相同的程序包的依赖项混淆而导致供应链攻击的风险。

为了说明弱匹配行为，假设程序包组 `/npm/*` 允许摄取但阻止发布。更具体的程序包组 `/npm//anycompany-spicy-client$` 被配置为阻止摄取但允许发布。名为 *anycompany-spicy-client* 的程序包是程序包组的强匹配，允许发布程序包版本但阻止摄取程序包版本。允许发布的程序包名称的唯一大小写格式为 *anycompany-spicy-client*，因为它是程序包定义模式的强匹配。另一种大小写变体（例如 *AnyCompany-spicy-client*）由于是弱匹配，因此无法发布。更重要的是，程序包组会阻止摄取所有大小写变体，而不仅仅是模式中使用的小写名称，从而降低了依赖项混淆攻击的风险。

## 其他变体
<a name="package-group-additional-variations"></a>

除了大小写差异外，弱匹配还会忽略破折号 `-`、点 `.`、下划线 `_` 和易混淆字符（例如来自不同字母表的外观相似的字符）序列方面的差异。在用于弱匹配的规范化期间，CodeArtifact 会执行大小写折叠（类似于转换为小写形式），用单个点替换短划线、点和下划线字符序列，并规范易混淆的字符。

弱匹配将破折号、点和下划线视为等效，但不会完全忽略它们。这意味着 *foo-bar*、*foo.bar*、*foo..bar* 和 *foo\$1bar* 都是弱匹配的等效形式，但 *foobar* 不是。尽管一些公有存储库实施了相应措施来防止出现这些类型的变体，但公有存储库提供的保护并没有使程序包组的这一功能变得不必要。例如，诸如 npm 公有注册表之类的公有存储库只有在 *my-package* 已发布到名为 *my-package* 的程序包时，才会阻止该程序包的新变体。如果 *my-package* 是内部程序包，并且您已创建允许发布但阻止摄取的程序包组 `/npm//my-package$`，那么您可能不想将 *my-package* 发布到 npm 公有注册表，以防止允许诸如 *my.package* 之类的变体。

虽然某些程序包格式（例如 Maven）对这些字符的处理方式不同（Maven 将 `.` 而不是 `-` 或 `_` 视为命名空间层次结构分隔符），但像 *com.act-on* 这样的程序包仍可能与 *com.act.on* 发生混淆。

**注意**  
请注意，每当有多个变体与一个程序包组关联时，管理员都可以为特定变体创建一个新的程序包组，以便为该变体配置不同的行为。

# 在 CodeArtifact 中标记程序包组
<a name="package-group-tags"></a>

标签是与 AWS 资源关联的键/值对。您可以在 CodeArtifact 中向程序包组应用标签。有关 CodeArtifact 资源标记、使用场景、标签键和值约束以及支持的资源类型的信息，请参阅[为资源添加标签](tag-resources.md)。

创建程序包组或者添加、删除或更新现有程序包组的标签值时，可以使用 CLI 来指定标签。

## 标记程序包组（CLI）
<a name="package-group-tags-cli"></a>

您可以使用 CLI 来管理程序包组标签。

如果还没有配置 AWS CLI，请按照[使用进行设置 AWS CodeArtifact](get-set-up-for-codeartifact.md)中的步骤进行配置。

**提示**  
要添加标签，您必须提供程序包组的 Amazon 资源名称（ARN）。要获取程序包组的 ARN，请运行 `describe-package-group` 命令：  

```
aws codeartifact describe-package-group \
   --domain my_domain \
   --package-group /npm/scope/anycompany~ \
   --query packageGroup.arn
```

**Topics**
+ [为程序包组添加标签（CLI）](#package-group-tags-add-cli)
+ [查看程序包组的标签（CLI）](#package-group-tags-list-cli)
+ [编辑程序包组的标签（CLI）](#package-group-tags-edit-cli)
+ [从程序包组中删除标签（CLI）](#package-group-tags-delete-cli)

### 为程序包组添加标签（CLI）
<a name="package-group-tags-add-cli"></a>

您可以在创建程序包组时为其添加标签，也可以为现有程序包组添加标签。有关在创建程序包组时为其添加标签的信息，请参阅[创建程序包组](create-package-group.md)。

要使用 AWS CLI 为现有程序包组添加标签，请在终端或命令行运行 **tag-resource** 命令，指定要为其添加标签的程序包组的 Amazon 资源名称（ARN），以及要添加的标签的键/值。有关程序包组 ARN 的信息，请参阅[Package 组 ARNs](auth-and-access-control-permissions-reference.md#package-group-arns)。

您可以为程序包组添加多个标签。例如，要为程序包组 */npm/scope/anycompany\$1* 添加两个标签，一个标签键名为 *key1*，标签值为 *value1*，另一个标签键名为 *key2*，标签值为 *value2*，请运行以下命令：

```
aws codeartifact tag-resource \
   --resource-arn arn:aws:codeartifact:us-west-2:123456789012:package-group/my_domain/npm/scope/anycompany~ \
   --tags key=key1,value=value1 key=key2,value=value2
```

如果成功，此命令没有输出。

### 查看程序包组的标签（CLI）
<a name="package-group-tags-list-cli"></a>

按照以下步骤使用 AWS CLI 来查看程序包组的 AWS 标签。如果尚未添加标签，则返回的列表为空。

在终端或命令行中，使用程序包组的 Amazon 资源名称（ARN）运行 **list-tags-for-resource** 命令。有关程序包组 ARN 的信息，请参阅[Package 组 ARNs](auth-and-access-control-permissions-reference.md#package-group-arns)。

例如，要查看名为 */npm/scope/anycompany\$1* 且 ARN 值为 `arn:aws:codeartifact:us-west-2:123456789012:package-group/my_domain/npm/scope/anycompany~` 的程序包组的标签键和标签值列表，请运行以下命令：

```
aws codeartifact list-tags-for-resource \
   --resource-arn arn:aws:codeartifact:us-west-2:123456789012:package-group/my_domain/npm/scope/anycompany~
```

如果成功，该命令返回类似以下内容的信息：

```
{
    "tags": {
        "key1": "value1",
        "key2": "value2"
    }
}
```

### 编辑程序包组的标签（CLI）
<a name="package-group-tags-edit-cli"></a>

执行以下步骤，使用 AWS CLI 编辑程序包组的标签。您可以更改现有键的值或添加另一个键。您还可以从程序包组中删除标签，如下一节所示。

在终端或命令行运行 **tag-resource** 命令，指定要为其更新标签的程序包组的 ARN 并指定标签键和标签值。有关程序包组 ARN 的信息，请参阅[Package 组 ARNs](auth-and-access-control-permissions-reference.md#package-group-arns)。

```
aws codeartifact tag-resource \
   --resource-arn arn:aws:codeartifact:us-west-2:123456789012:package-group/my_domain/npm/scope/anycompany~ \
   --tags key=key1,value=newvalue1
```

如果成功，此命令没有输出。

### 从程序包组中删除标签（CLI）
<a name="package-group-tags-delete-cli"></a>

可以按照以下步骤，使用 AWS CLI 从程序包组中删除标签。

**注意**  
如果删除程序包组，则系统会从删除的程序包组中删除所有标签关联。您无需在删除程序包组之前删除标签。

在终端或命令行运行 **untag-resource** 命令，指定要从中删除标签的程序包组的 ARN 以及要删除的标签的标签键。有关程序包组 ARN 的信息，请参阅[Package 组 ARNs](auth-and-access-control-permissions-reference.md#package-group-arns)。

例如，要删除程序包组 */npm/scope/anycompany\$1* 上的多个标签，标签键为 *key1* 和 *key2*，请运行以下命令：

```
aws codeartifact untag-resource \
   --resource-arn arn:aws:codeartifact:us-west-2:123456789012:package-group/my_domain/npm/scope/anycompany~ \
   --tag-keys key1 key2
```

如果成功，此命令没有输出。删除标签后，您可以使用 `list-tags-for-resource` 命令查看程序包组上剩余的标签。