

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

# 将 CodeArtifact 与 npm 结合使用
<a name="using-npm"></a>

这些主题说明了如何在 CodeArtifact 中使用 npm（Node.js 程序包管理器）。

**注意**  
CodeArtifact 支持 `node v4.9.1` 和更高版本以及 `npm v5.0.0` 和更高版本。

**Topics**
+ [配置和使用 npm](npm-auth.md)
+ [配置和使用 Yarn](npm-yarn.md)
+ [npm 命令支持](npm-commands.md)
+ [npm 标签处理](npm-tags.md)
+ [支持兼容 npm 的程序包管理器](npm-other-clients.md)

# 配置并使用 npm CodeArtifact
<a name="npm-auth"></a>

在中创建存储库后 CodeArtifact，可以使用 npm 客户端安装和发布软件包。使用存储库端点和授权令牌配置 npm 的推荐方法是使用 `aws codeartifact login` 命令。也可以手动配置 npm。

**Contents**
+ [使用 login 命令配置 npm](#configure-npm-login-command)
+ [不使用 login 命令配置 npm](#configuring-npm-without-using-the-login-command)
+ [运行 npm 命令](#running-npm-commands)
+ [验证 npm 身份验证和授权](#verifying-npm-authentication-and-authorization)
+ [改回默认 npm 注册表](#revert-default-npm-registry)
+ [解决 npm 8.x 或更高版本中安装缓慢的问题](#troubleshooting-slow-npm-install)

## 使用 login 命令配置 npm
<a name="configure-npm-login-command"></a>

使用 `aws codeartifact login` 命令提取用于 npm 的凭证。

**注意**  
如果您要访问您拥有的域中的存储库，则无需包括 `--domain-owner`。有关更多信息，请参阅 [跨账户域](domain-overview.md#domain-overview-cross-account)。

**重要**  
如果您使用的是 npm 10.x 或更高版本，则必须使用 2.9.5 或更高 AWS CLI 版本才能成功运行该命令。`aws codeartifact login`

```
aws codeartifact login --tool npm --domain my_domain --domain-owner 111122223333 --repository my_repo
```

此命令对您的 \$1/.npmrc 文件进行以下更改：
+  CodeArtifact 使用您的 AWS 凭证获取授权令牌后，添加授权令牌。
+ 将 npm 注册表设置为通过 `--repository` 选项指定的存储库。
+ **对于 npm 6 及更低版本：**添加 `"always-auth=true"`，为每个 npm 命令发送授权令牌。

调用 `login` 后的默认授权期为 12 小时，且必须调用 `login` 来定期刷新令牌。有关使用 `login` 命令创建的授权令牌的更多信息，请参阅 [使用 `login` 命令创建的令牌](tokens-authentication.md#auth-token-login)。

## 不使用 login 命令配置 npm
<a name="configuring-npm-without-using-the-login-command"></a>

你可以通过手动更新 npm 配置，在不使用`aws codeartifact login`命令的情况下使用 CodeArtifact 存储库配置 npm。

**不使用 login 命令配置 npm**

1. 在命令行中，获取 CodeArtifact 授权令牌并将其存储在环境变量中。npm 将使用此令牌对您的存储库进行身份验证。 CodeArtifact 
**注意**  
以下命令适用于 macOS 或 Linux 计算机。有关在 Windows 计算机上配置环境变量的信息，请参阅[使用环境变量传递身份验证令牌](tokens-authentication.md#env-var)。

   ```
   CODEARTIFACT_AUTH_TOKEN=`aws codeartifact get-authorization-token --domain my_domain --domain-owner 111122223333 --query authorizationToken --output text`
   ```

1. 运行以下命令获取 CodeArtifact 仓库的终端节点。您的存储库端点用于将 npm 指向您的存储库来安装或发布程序包。
   + *my\$1domain*用您的 CodeArtifact 域名替换。
   + *111122223333*替换为域名所有者的 AWS 账户 ID。如果您要访问您拥有的域中的存储库，则无需包括 `--domain-owner`。有关更多信息，请参阅 [跨账户域](domain-overview.md#domain-overview-cross-account)。
   + *my\$1repo*替换为您的 CodeArtifact 存储库名称。

   ```
   aws codeartifact get-repository-endpoint --domain my_domain --domain-owner 111122223333 --repository my_repo --format npm
   ```

   以下 URL 是一个示例存储库端点。

   ```
   https://my_domain-111122223333.d.codeartifact.us-west-2.amazonaws.com/npm/my_repo/
   ```
**重要**  
注册 URL 必须以正斜杠 (/) 结尾。否则，您无法连接到存储库。

1. 使用`npm config set`命令为您的 CodeArtifact 存储库设置注册表。将 URL 替换为上一步中的存储库端点 URL。

   ```
   npm config set registry=https://my_domain-111122223333.d.codeartifact.region.amazonaws.com/npm/my_repo/
   ```
**注意**  
要使用双堆栈端点，请使用 `codeartifact.region.on.aws` 端点。

1. 使用 `npm config set` 命令将您的授权令牌添加到 npm 配置。

   ```
   npm config set //my_domain-111122223333.d.codeartifact.region.amazonaws.com/npm/my_repo/:_authToken=$CODEARTIFACT_AUTH_TOKEN
   ```

   **对于 npm 6 或更低版本：**要让 npm 始终将身份验证令牌传递给 CodeArtifact，即使对于`GET`请求也是如此，请将`always-auth`配置变量设置为。`npm config set`

   ```
   npm config set //my_domain-111122223333.d.codeartifact.region.amazonaws.com/npm/my_repo/:always-auth=true
   ```

**示例 npm 配置文件 (`.npmrc`)**

 以下是按照上述说明设置 CodeArtifact 注册表端点、添加身份验证令牌和配置后的示例`.npmrc`文件`always-auth`。

```
registry=https://my_domain-111122223333.d.codeartifact.us-west-2.amazonaws.com/npm/my-cli-repo/
//my_domain-111122223333.d.codeartifact.us-west-2.amazonaws.com/npm/my_repo/:_authToken=eyJ2ZX...
//my_domain-111122223333.d.codeartifact.us-west-2.amazonaws.com/npm/my_repo/:always-auth=true
```

## 运行 npm 命令
<a name="running-npm-commands"></a>

配置 npm 客户端后，您可以运行 npm 命令。假设您的存储库或其中一个上游存储库中存在程序包，则可以使用 `npm install` 来安装。例如，使用以下命令来安装 `lodash` 程序包。

```
npm install lodash
```

使用以下命令将新的 npm 包发布到 CodeArtifact 存储库。

```
npm publish
```

有关如何创建 npm 程序包的信息，请参阅 npm 文档网站上的[创建 Node.js 模块](https://docs.npmjs.com/getting-started/creating-node-modules)。有关支持的 npm 命令列表，请参阅 [npm Comm CodeArtifact and Suppor](npm-commands.md) t。

## 验证 npm 身份验证和授权
<a name="verifying-npm-authentication-and-authorization"></a>

调用 `npm ping` 命令是验证以下项的一种方式：
+ 您已正确配置凭据，以便可以对 CodeArtifact 存储库进行身份验证。
+ 授权配置为您授予 `ReadFromRepository` 权限。

成功调用 `npm ping` 后的输出如下所示。

```
$ npm -d ping
npm info it worked if it ends with ok
npm info using npm@6.4.1
npm info using node@v9.5.0
npm info attempt registry request try #1 at 4:30:59 PM
npm http request GET https://<domain>.d.codeartifact.us-west-2.amazonaws.com/npm/shared/-/ping?write=true
npm http 200 https:///npm/shared/-/ping?write=true
Ping success: {}
npm timing npm Completed in 716ms
npm info ok
```

`-d` 选项会让 npm 输出额外的调试信息，包括存储库 URL。通过这些信息，可以轻松确认 npm 已配置为使用您期望的存储库。

## 改回默认 npm 注册表
<a name="revert-default-npm-registry"></a>

配置 npm 会将 npm 注册表 CodeArtifact 设置为指定的 CodeArtifact 存储库。完成连接后，你可以运行以下命令将 npm 注册表设置回其默认注册表。 CodeArtifact

```
npm config set registry https://registry.npmjs.com/
```

## 解决 npm 8.x 或更高版本中安装缓慢的问题
<a name="troubleshooting-slow-npm-install"></a>

在 npm 版本 8.x 及更高版本中存在一个已知问题，也即，如果向程序包存储库发出请求，并且存储库将客户端重定向到 Amazon S3 而不是直接流式传输资产，则 npm 客户端可能对于每个依赖项会挂起几分钟。

由于 CodeArtifact 存储库旨在始终将请求重定向到 Amazon S3，因此有时会出现此问题，由于 npm 安装时间长，这会导致构建时间过长。这种行为的实例将以进度条的形式出现，显示达几分钟。

要避免此问题，请在 `npm` cli 命令中使用 `--no-progress` 或 `progress=false` 标志，如以下示例所示。

```
npm install lodash --no-progress
```

# 在 CodeArtifact 中配置和使用 Yarn
<a name="npm-yarn"></a>

创建存储库后，您可以使用 Yarn 客户端来管理 npm 程序包。

**注意**  
`Yarn 1.X` 会读取和使用 npm 配置文件 (.npmrc) 中的信息，但 `Yarn 2.X` 不会。`Yarn 2.X` 的配置必须在.yarnrc.yml 文件中定义。

**Contents**
+ [使用 `aws codeartifact login` 命令配置 Yarn 1.X](#npm-yarn-configure-login)
+ [使用 `yarn config set` 命令配置 Yarn 2.X](#npm-yarn-configure-yarn-command)

## 使用 `aws codeartifact login` 命令配置 Yarn 1.X
<a name="npm-yarn-configure-login"></a>

对于 `Yarn 1.X`，您可以使用 `aws codeartifact login` 命令在 CodeArtifact 中配置 Yarn。`login` 命令将使用您的 CodeArtifact 存储库端点信息和凭证配置 \$1/.npmrc 文件。在 `Yarn 1.X` 中，`yarn` 命令使用 \$1/.npmrc 文件中的配置信息。

**使用 login 命令配置 `Yarn 1.X`**

1. 如果尚未配置要与 AWS CLI 一起使用的 AWS 凭证，请先配置凭证，如[开始使用 CodeArtifact](getting-started.md) 中所述。

1. 要成功运行 `aws codeartifact login` 命令，必须安装 npm。有关安装说明，请参阅 *npm 文档*中的[下载和安装 Node.js 和 npm](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm/)。

1. 使用 `aws codeartifact login` 命令提取 CodeArtifact 凭证并配置您的 \$1/.npmrc 文件。
   + 将 *my\$1domain* 替换为您的 CodeArtifact 域名。
   + 将 *111122223333* 替换为域所有者的 AWS 账户 ID。如果您要访问您拥有的域中的存储库，则无需包括 `--domain-owner`。有关更多信息，请参阅 [跨账户域](domain-overview.md#domain-overview-cross-account)。
   + 将 *my\$1repo* 替换为您的 CodeArtifact 存储库名称。

   ```
   aws codeartifact login --tool npm --domain my_domain --domain-owner 111122223333 --repository my_repo
   ```

   `login` 命令对 \$1/.npmrc 文件进行以下更改：
   + 使用 AWS 凭证从 CodeArtifact 获取授权令牌后添加授权令牌。
   + 将 npm 注册表设置为通过 `--repository` 选项指定的存储库。
   + **对于 npm 6 及更低版本：**添加 `"always-auth=true"`，为每个 npm 命令发送授权令牌。

   调用 `login` 后的默认授权期为 12 小时，且必须调用 `login` 来定期刷新令牌。有关使用 `login` 命令创建的授权令牌的更多信息，请参阅 [使用 `login` 命令创建的令牌](tokens-authentication.md#auth-token-login)。

1. **对于 npm 7.X 和 8.X**，必须将 `always-auth=true` 添加到 \$1/.npmrc 文件中才能使用 Yarn。

   1. 在文本编辑器中打开 \$1/.npmrc 文件并在新行中添加 `always-auth=true`。

您可以使用 `yarn config list` 命令来检查 Yarn 是否使用了正确的配置。运行命令后，请检查 `info npm config` 部分中的值。其内容看起来类似于以下代码段。

```
info npm config
{
  registry: 'https://my_domain-111122223333.d.codeartifact.us-west-2.amazonaws.com/npm/my_repo/',
  '//my_domain-111122223333.d.codeartifact.us-west-2.amazonaws.com/npm/my_repo/:_authToken': 'eyJ2ZXI...',
  'always-auth': true
}
```

## 使用 `yarn config set` 命令配置 Yarn 2.X
<a name="npm-yarn-configure-yarn-command"></a>

以下程序详细说明了如何使用 `yarn config set` 命令从命令行更新 `.yarnrc.yml` 配置，从而配置 `Yarn 2.X`。

**从命令行更新 `yarnrc.yml` 配置**

1. 如果尚未配置要与 AWS CLI 一起使用的 AWS 凭证，请先配置凭证，如[开始使用 CodeArtifact](getting-started.md) 中所述。

1. 使用 `aws codeartifact get-repository-endpoint` 命令来获取 CodeArtifact 存储库的端点。
   + 将 *my\$1domain* 替换为您的 CodeArtifact 域名。
   + 将 *111122223333* 替换为域所有者的 AWS 账户 ID。如果您要访问您拥有的域中的存储库，则无需包括 `--domain-owner`。有关更多信息，请参阅 [跨账户域](domain-overview.md#domain-overview-cross-account)。
   + 将 *my\$1repo* 替换为您的 CodeArtifact 存储库名称。

   ```
   aws codeartifact get-repository-endpoint --domain my_domain --domain-owner 111122223333 --repository my_repo --format npm
   ```

1. 使用存储库端点更新 .yarnrc.yml 文件中的 `npmRegistryServer` 值。

   ```
   yarn config set npmRegistryServer "https://my_domain-111122223333.d.codeartifact.region.amazonaws.com/npm/my_repo/"
   ```

1. 提取 CodeArtifact 授权令牌并将其存储在环境变量中。
**注意**  
以下命令适用于 macOS 或 Linux 计算机。有关在 Windows 计算机上配置环境变量的信息，请参阅[使用环境变量传递身份验证令牌](tokens-authentication.md#env-var)。
   + 将 *my\$1domain* 替换为您的 CodeArtifact 域名。
   + 将 *111122223333* 替换为域所有者的 AWS 账户 ID。如果您要访问您拥有的域中的存储库，则无需包括 `--domain-owner`。有关更多信息，请参阅 [跨账户域](domain-overview.md#domain-overview-cross-account)。
   + 将 *my\$1repo* 替换为您的 CodeArtifact 存储库名称。

   ```
   export CODEARTIFACT_AUTH_TOKEN=`aws codeartifact get-authorization-token --domain my_domain --domain-owner 111122223333 --query authorizationToken --output text`
   ```

1. 使用 `yarn config set` 命令将 CodeArtifact 身份验证令牌添加到 .yarnrc.yml 文件中。将以下命令中的 URL 替换为步骤 2 中的存储库端点 URL。

   ```
   yarn config set 'npmRegistries["https://my_domain-111122223333.d.codeartifact.region.amazonaws.com/npm/my_repo/"].npmAuthToken' "${CODEARTIFACT_AUTH_TOKEN}"
   ```

1. 使用 `yarn config set` 命令将 `npmAlwaysAuth` 的值设置为 `true`。将以下命令中的 URL 替换为步骤 2 中的存储库端点 URL。

   ```
   yarn config set 'npmRegistries["https://my_domain-111122223333.d.codeartifact.region.amazonaws.com/npm/my_repo/"].npmAlwaysAuth' "true"
   ```

配置完成后，.yarnrc.yml 配置文件的内容应与以下代码段类似。

```
npmRegistries:
  "https://my_domain-111122223333.d.codeartifact.us-west-2.amazonaws.com/npm/my_repo/":
    npmAlwaysAuth: true
    npmAuthToken: eyJ2ZXI...

npmRegistryServer: "https://my_domain-111122223333.d.codeartifact.us-west-2.amazonaws.com/npm/my_repo/"
```

您也可以使用 `yarn config` 命令来检查 `npmRegistries` 和 `npmRegistryServer` 的值。

# npm 命令支持
<a name="npm-commands"></a>

以下各节总结了 CodeArtifact存储库支持的 npm 命令以及不支持的特定命令。

**Contents**
+ [与存储库进行交互的受支持命令](#supported-commands-that-interact-with-a-repository)
+ [支持的客户端命令](#supported-client-side-commands)
+ [不受支持的命令](#unsupported-commands)

## 与存储库进行交互的受支持命令
<a name="supported-commands-that-interact-with-a-repository"></a>

本节列出了 npm 命令，其中 npm 客户端向其配置的注册表发出一个或多个请求（例如，使用 `npm config set registry`）。这些命令已经过验证，在针对 CodeArtifact 存储库调用时可以正常运行。


****  

| 命令 | 说明 | 
| --- | --- | 
|   [bugs](https://docs.npmjs.com/cli/bugs)   |  尝试猜测程序包的错误跟踪器 URL 的位置，然后尝试打开它。  | 
|   [ci](https://docs.npmjs.com/cli/ci)   |  从零开始安装一个项目。  | 
|   [deprecate](https://docs.npmjs.com/cli/deprecate)   |  弃用程序包的某个版本。  | 
|   [dist-tag](https://docs.npmjs.com/cli/dist-tag)   |  修改程序包分发标签。  | 
|   [docs](https://docs.npmjs.com/cli/docs)   |  尝试猜测程序包的文档 URL 的位置，然后尝试使用 `--browser` 配置参数打开它。  | 
|   [doctor](https://docs.npmjs.com/cli/doctor)   |  运行一系列检查以确保你的 npm 安装具有管理 JavaScript 软件包所需的内容。  | 
|   [install](https://docs.npmjs.com/cli/install)   |  安装程序包。  | 
|   [install-ci-test](https://docs.npmjs.com/cli/install-ci-test)   |  从零开始安装一个项目并运行测试。别名：`npm cit`。此命令运行 `npm ci`，然后立即运行 `npm test`。  | 
|   [install-test](https://docs.npmjs.com/cli/install-test)   |  安装程序包并运行测试。运行 `npm install`，然后立即运行 `npm test`。  | 
|   [outdated](https://docs.npmjs.com/cli/outdated)   |  检查已配置的注册表，查看当前是否有任何已安装的程序包已过时。  | 
|   [ping](https://docs.npmjs.com/cli/ping)   |  ping 已配置或给定的 npm 注册表并验证身份验证。  | 
|   [publish](https://docs.npmjs.com/cli/publish)   |  将程序包版本发布到注册表。  | 
|   [update](https://docs.npmjs.com/cli/update)   |  猜测程序包存储库 URL 的位置，然后尝试使用 `--browser` 配置参数来打开它。  | 
|   [view](https://docs.npmjs.com/cli/view)   |  显示程序包元数据。可用于输出元数据属性。  | 

## 支持的客户端命令
<a name="supported-client-side-commands"></a>

这些命令不需要与存储库进行任何直接交互，因此 CodeArtifact 无需执行任何操作即可支持它们。


****  

| 命令 | 说明 | 
| --- | --- | 
|   [build](https://docs.npmjs.com/cli/v6/commands/npm-build)   |  构建程序包。  | 
|   [cache](https://docs.npmjs.com/cli/cache)   |  操作程序包缓存。  | 
|   [completion](https://docs.npmjs.com/cli/completion)   |  在所有 npm 命令中启用制表符自动完成功能。  | 
|   [config](https://docs.npmjs.com/cli/config)   |  更新用户和全局 `npmrc` 文件的内容。  | 
|   [dedupe](https://docs.npmjs.com/cli/dedupe)   |  搜索本地程序包树，并尝试通过将依赖项进一步向上移动来简化结构，这样多个依赖程序包就可以更有效地共享依赖项。  | 
|   [edit](https://docs.npmjs.com/cli/edit)   |  编辑已安装的程序包。在当前工作目录中选择一个依赖项，然后在默认编辑器中打开程序包文件夹。  | 
|   [explore](https://docs.npmjs.com/cli/explore)   |  浏览已安装的程序包。在指定的已安装程序包目录中创建一个子 Shell。如果指定了命令，则该命令将在该子 Shell 中运行，然后立即终止。  | 
|   [help](https://docs.npmjs.com/cli/help)   |  获取有关 npm 的帮助。  | 
|   [help-search](https://docs.npmjs.com/cli/help-search)   |  搜索 npm 帮助文档。  | 
|   [init](https://docs.npmjs.com/cli/init)   |  创建 `package.json` 文件。  | 
|   [link](https://docs.npmjs.com/cli/link)   |  创建指向程序包文件夹的符号链接。  | 
|   [ls](https://docs.npmjs.com/cli/ls)   |  列出已安装的程序包。  | 
|   [pack](https://docs.npmjs.com/cli/pack)   |  将程序包打包成 tarball。  | 
|   [prefix](https://docs.npmjs.com/cli/prefix)   |  显示前缀。除非也指定了 `-g`，否则这是包含 `package.json` 文件的最接近父目录。  | 
|   [prune](https://docs.npmjs.com/cli/prune)   |  删除未在父程序包依赖项列表中列出的程序包。  | 
|   [rebuild](https://docs.npmjs.com/cli/rebuild)   |  对匹配的文件夹运行 `npm build` 命令。  | 
|   [restart](https://docs.npmjs.com/cli/restart)   |  运行程序包的停止、重启和启动脚本以及相关的前置和后置脚本。  | 
|   [root](https://docs.npmjs.com/cli/root)   |  将有效的 `node_modules` 文件夹输出到标准输出。  | 
|   [run-script](https://docs.npmjs.com/cli/run-script)   |  运行任意程序包脚本。  | 
|   [shrinkwrap](https://docs.npmjs.com/cli/shrinkwrap)   |  锁定依赖项版本以供发布。  | 
|   [uninstall](https://docs.npmjs.com/cli/uninstall)   |  卸载程序包。  | 

## 不受支持的命令
<a name="unsupported-commands"></a>

 CodeArtifact 存储库不支持这些 npm 命令。


****  

| 命令 | 说明 | 备注 | 
| --- | --- | --- | 
|   [access](https://docs.npmjs.com/cli/access)   |  设置已发布程序包的访问级别。  |  CodeArtifact 使用的权限模型不同于公共 npmjs 存储库。  | 
|   [adduser](https://docs.npmjs.com/cli/adduser)   |  添加注册表用户账户  |  CodeArtifact 使用的用户模型不同于公共 npmjs 存储库。  | 
|   [audit](https://docs.npmjs.com/cli/audit)   |  运行安全审核。  |  CodeArtifact 目前不提供安全漏洞数据。  | 
|   [hook](https://docs.npmjs.com/cli/hook)   |  管理 npm 钩子，包括添加、移除、列出和更新。  |  CodeArtifact 目前不支持任何类型的变更通知机制。  | 
|   [login](https://docs.npmjs.com/cli-commands/adduser.html)   |  对用户进行身份验证。这是 `npm adduser` 的一个别名。  |  CodeArtifact 使用的身份验证模型不同于公共 npmjs 存储库。有关信息，请参阅[使用 npm 进行身份验证](npm-auth.md)。  | 
|   [logout](https://docs.npmjs.com/cli/logout)   |  注销注册表。  |  CodeArtifact 使用的身份验证模型不同于公共 npmjs 存储库。无法从 CodeArtifact 存储库中注销，但是身份验证令牌将在其可配置的到期时间后过期。默认令牌持续时间为 12 小时。  | 
|   [owner](https://docs.npmjs.com/cli/owner)   |  管理程序包所有者。  |  CodeArtifact 使用的权限模型不同于公共 npmjs 存储库。  | 
|   [profile](https://docs.npmjs.com/cli/profile)   |  更改注册表配置文件的设置。  |  CodeArtifact 使用的用户模型不同于公共 npmjs 存储库。  | 
|   [search](https://docs.npmjs.com/cli/search)   |  在注册表中搜索与搜索词匹配的程序包。  |  CodeArtifact 使用 [list-p](list-packages.md) ackages 命令支持有限的搜索功能。  | 
|   [star](https://docs.npmjs.com/cli/star)   |  标记您喜欢的程序包。  |  CodeArtifact 目前不支持任何类型的收藏夹机制。  | 
|   [stars](https://docs.npmjs.com/cli/stars)   |  查看已标记为收藏的程序包。  |  CodeArtifact 目前不支持任何类型的收藏夹机制。  | 
|   [team](https://docs.npmjs.com/cli/team)   |  管理组织团队和团队成员资格。  |  CodeArtifact 使用的用户和组成员资格模型不同于公共 npmjs 存储库。有关信息，请参阅**《IAM 用户指南》中的[身份（用户和角色）](https://docs.aws.amazon.com/IAM/latest/UserGuide/id.html)。  | 
|   [token](https://docs.npmjs.com/cli/token)   |  管理您的身份验证令牌。  |  CodeArtifact 使用不同的模型来获取身份验证令牌。有关信息，请参阅[使用 npm 进行身份验证](npm-auth.md)。  | 
|   [unpublish](https://docs.npmjs.com/cli/unpublish)   |  从注册表中移除程序包。  |  CodeArtifact 不支持使用 npm 客户端从存储库中删除软件包版本。您可以使用 [delete-package-version](delete-package.md) 命令。  | 
|   [whoami](https://docs.npmjs.com/cli/whoami)   |  显示 npm 用户名。  |  CodeArtifact 使用的用户模型不同于公共 npmjs 存储库。  | 

# 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
```

# 支持兼容 npm 的程序包管理器
<a name="npm-other-clients"></a>

这些其他程序包管理器与 CodeArtifact 兼容，可以处理 npm 程序包格式和 npm 通信协议：
+  [pnpm 程序包管理器](https://pnpm.js.org)。确认可与 CodeArtifact 配合使用的最新版本是 3.3.4，已于 2019 年 5 月 18 日发布。
+  [Yarn 程序包管理器](https://yarnpkg.com/)。确认可与 CodeArtifact 配合使用的最新版本是 1.21.1，已于 2019 年 12 月 11 日发布。

**注意**  
我们建议将 Yarn 2.x 与 CodeArtifact 配合使用。Yarn 1.x 没有 HTTP 重试功能，这意味着该版本更容易出现间歇性服务故障，进而导致出现 500 级状态代码或错误。无法为 Yarn 1.x 配置不同的重试策略，但已在 Yarn 2.x 中添加了重试策略。您可以使用 Yarn 1.x，但可能需要在构建脚本中添加更高级别的重试机制。例如，在一个循环中多次执行 Yarn 命令，以便在下载程序包失败时会进行重试。