

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

# npm 标签处理
<a name="npm-tags"></a>

 npm 注册表支持*标签*，这些标签是程序包版本的字符串别名。您可以使用标签来提供别名而不是提供版本号。例如，您可能有一个包含多个开发流的项目，并且为每个流使用不同的标签（例如 `stable`、`beta`、`dev`、`canary`）。有关更多信息，请参阅 npm 网站上的 [dist-tag](https://docs.npmjs.com/cli/dist-tag)。

 默认情况下，npm 使用 `latest` 标签来标识程序包的当前版本。`npm install {{pkg}}`（不带 `@{{version}}` 或 `@{{tag}}` 说明符）会安装最新的标签。通常，项目仅对稳定版本使用最新标签。对于不稳定版本或预发行版本使用其他标签。

## 使用 npm 客户端编辑标签
<a name="editing-tags-with-the-npm-client"></a>

 三个 `npm dist-tag` 命令（`add`、`rm` 和 `ls`）在 CodeArtifact 存储库中的功能与在[默认 npm 注册表](https://registry.npmjs.com/)中的功能相同。

## npm 标签和 CopyPackageVersions API
<a name="tags-and-cpv"></a>

当您使用 `CopyPackageVersions` API 来复制 npm 程序包版本时，所有作为该版本别名的标签都会复制到目标存储库。如果要复制的版本的标签也存在于目标存储库中，则复制操作会将目标存储库中的标签值设置为与源存储库中的值相匹配。

例如，假设存储库 S 和存储库 D 都包含 `web-helper` 程序包的一个版本，其最新标签设置如下表所示。


****  

| 存储库 | 程序包名称 | 程序包标签 | 
| --- | --- | --- | 
|  S  |  `web-helper`  |   *最新*（版本 1.0.1 的别名）  | 
|  D  |  `web-helper`  |   *最新*（版本 1.0.0 的别名）  | 

 调用 `CopyPackageVersions` 来将 `web-helper` 1.0.1 从 S 复制到 D。操作完成后，存储库 D 中 `web-helper` 的 `latest` 标签别名为 1.0.1，而不是 1.0.0。

如果在复制后需要更改标签，请使用 `npm dist-tag` 命令直接在目标存储库中修改标签。有关 `CopyPackageVersions` API 的更多信息，请参阅[在存储库之间复制程序包](copy-package.md)。

## npm 标签和上游存储库
<a name="tags-and-upstreams"></a>

当 npm 请求程序包的标签且上游存储库也存在该程序包的版本时，CodeArtifact 会合并标签，然后再将标签返回给客户端。例如，名为 R 的存储库有一个名为 U 的上游存储库。下表显示了两个存储库中都存在的名为 `web-helper` 的程序包的标签。


****  

| 存储库 | 程序包名称 | 程序包标签 | 
| --- | --- | --- | 
|  R  |  `web-helper`  |   *最新*（版本 1.0.0 的别名）  | 
|  U  |  `web-helper`  |   *alpha*（版本 1.0.1 的别名）  | 

在这种情况下，当 npm 客户端从存储库 R 获取 `web-helper` 程序包的标签时，它会同时收到*最新*标签和 *alpha* 标签。标签指向的版本不会改变。

当上游和下游存储库中的同一个程序包存在相同的标签时，CodeArtifact 会使用*上游*存储库中存在的标签。例如，假设 *webhelper* 上的标签已修改为如下所示。


****  

| 存储库 | 程序包名称 | 程序包标签 | 
| --- | --- | --- | 
|  R  |  `web-helper`  |   *最新*（版本 1.0.0 的别名）  | 
|  U  |  `web-helper`  |   *最新*（版本 1.0.1 的别名）  | 

在这种情况下，当 npm 客户端从存储库 R 提取程序包 *web-helper* 的标签时，因为上游存储库中存在*最新*标签，所以该标签将作为版本 *1.0.1* 的别名。这样就可以运行 `npm update`，在上游存储库中更轻松地使用尚不存在于下游存储库中的新程序包版本。

在下游存储库中发布程序包的新版本时，在上游存储库中使用该标签会出现问题。例如，假设程序包 *web-helper* 的最新标签在 R 和 U 中相同。


****  

| 存储库 | 程序包名称 | 程序包标签 | 
| --- | --- | --- | 
|  R  |  `web-helper`  |   *最新*（版本 1.0.1 的别名）  | 
|  U  |  `web-helper`  |   *最新*（版本 1.0.1 的别名）  | 

当版本 1.0.2 发布到 R 时，npm 会将*最新*标签更新为 1.0.2。


****  

| 存储库 | 程序包名称 | 程序包标签 | 
| --- | --- | --- | 
|  R  |  `web-helper`  |   *最新*（版本 1.0.2 的别名）  | 
|  U  |  `web-helper`  |   *最新*（版本 1.0.1 的别名）  | 

但是，因为 U 中的*最新*值是 1.0.1，所以 npm 客户端永远看不到这个标签值。发布 1.0.2 后立即对存储库 R 运行 `npm install` 会安装 1.0.1，而不是安装刚刚发布的版本。要安装最新发布的版本，必须指定确切的程序包版本，如下所示。

```
npm install web-helper@1.0.2
```