

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

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

这些主题说明了如何在 CodeArtifact 中使用 Cargo（Rust 程序包管理器）。

**注意**  
CodeArtifact 仅支持 Cargo 1.74.0 及更高版本。Cargo 1.74.0 是最早支持在 CodeArtifact 存储库上进行身份验证的版本。

**Topics**
+ [配置和使用 Cargo](configure-use-cargo.md)
+ [

# Cargo 命令支持
](cargo-commands.md)

# 在 CodeArtifact 中配置和使用 Cargo
<a name="configure-use-cargo"></a>

您可以使用 Cargo 从 CodeArtifact 存储库发布和下载 crate，也可以从 Rust 社区的 crate 注册表 [crates.io](https://crates.io/) 中获取 crate。本主题介绍如何配置 Cargo 以使用 CodeArtifact 存储库进行身份验证，以及使用 CodeArtifact 存储库。

## 使用 CodeArtifact 配置 Cargo
<a name="configure-cargo"></a>

要使用 Cargo 从 AWS CodeArtifact 安装和发布 crate，首先需要使用您的 CodeArtifact 存储库信息对其进行配置。按照以下程序之一中的步骤，使用您的 CodeArtifact 存储库端点信息和凭证来配置 Cargo。

### 按照控制台说明配置 Cargo
<a name="configure-cargo-console"></a>

您可以按照控制台中的配置说明，将 Cargo 连接到 CodeArtifact 存储库。控制台说明提供了为 CodeArtifact 存储库定制的 Cargo 配置。您可以使用此自定义配置来设置 Cargo，而无需查找和填写 CodeArtifact 信息。

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

1. 在导航窗格中，选择**存储库**，然后选择要连接到 Cargo 的存储库。

1. 选择**查看连接说明**。

1. 选择操作系统。

1. 选择 **Cargo**。

1. 按照生成的说明，将 Cargo 连接到 CodeArtifact 存储库。

### 手动配置 Cargo
<a name="configure-cargo-manual"></a>

如果您无法或不想使用控制台中的配置说明，可以按照以下说明手动将 Cargo 连接到 CodeArtifact 存储库。

------
#### [ macOS and Linux ]

要使用 CodeArtifact 配置 Cargo，您需要在 Cargo 配置中将 CodeArtifact 存储库定义为注册表，并提供凭证。
+ 将 *my\$1registry* 替换为注册表名称。
+ 将 *my\$1domain* 替换为您的 CodeArtifact 域名。
+ 将 *111122223333* 替换为域所有者的 AWS 账户 ID。如果您要访问您拥有的域中的存储库，则无需包括 `--domain-owner`。有关更多信息，请参阅 [跨账户域](domain-overview.md#domain-overview-cross-account)。
+ 将 *my\$1repo* 替换为您的 CodeArtifact 存储库名称。

复制配置以将 Cargo 程序包发布并下载到您的存储库，然后将其保存到 `~/.cargo/config.toml` 文件（对于系统级配置）或 `.cargo/config.toml`（对于项目级配置）：

```
[registries.my_registry]
index = "sparse+https://my_domain-111122223333.d.codeartifact.us-west-2.amazonaws.com/cargo/my_repo/"
credential-provider = "cargo:token-from-stdout aws codeartifact get-authorization-token --domain my_domain --domain-owner 111122223333 --region us-west-2 --query authorizationToken --output text"

[registry]
default = "my_registry"

[source.crates-io]
replace-with = "my_registry"
```

------
#### [ Windows: Download packages only ]

要使用 CodeArtifact 配置 Cargo，您需要在 Cargo 配置中将 CodeArtifact 存储库定义为注册表，并提供凭证。
+ 将 *my\$1registry* 替换为注册表名称。
+ 将 *my\$1domain* 替换为您的 CodeArtifact 域名。
+ 将 *111122223333* 替换为域所有者的 AWS 账户 ID。如果您要访问您拥有的域中的存储库，则无需包括 `--domain-owner`。有关更多信息，请参阅 [跨账户域](domain-overview.md#domain-overview-cross-account)。
+ 将 *my\$1repo* 替换为您的 CodeArtifact 存储库名称。

复制配置以仅从您的存储库下载 Cargo 程序包，然后将其保存到 `%USERPROFILE%\.cargo\config.toml` 文件（对于系统级配置）或 `.cargo\config.toml`（对于项目级配置）：

```
[registries.my_registry]
index = "sparse+https://my_domain-111122223333.d.codeartifact.us-west-2.amazonaws.com/cargo/my_repo/"
credential-provider = "cargo:token-from-stdout aws codeartifact get-authorization-token --domain my_domain --domain-owner 111122223333 --region us-west-2 --query authorizationToken --output text"

[registry]
default = "my_registry"

[source.crates-io]
replace-with = "my_registry"
```

------
#### [ Windows: Publish and download packages ]

1. 要使用 CodeArtifact 配置 Cargo，您需要在 Cargo 配置中将 CodeArtifact 存储库定义为注册表，并提供凭证。
   + 将 *my\$1registry* 替换为注册表名称。
   + 将 *my\$1domain* 替换为您的 CodeArtifact 域名。
   + 将 *111122223333* 替换为域所有者的 AWS 账户 ID。如果您要访问您拥有的域中的存储库，则无需包括 `--domain-owner`。有关更多信息，请参阅 [跨账户域](domain-overview.md#domain-overview-cross-account)。
   + 将 *my\$1repo* 替换为您的 CodeArtifact 存储库名称。

   复制配置以将 Cargo 程序包发布并下载到您的存储库，然后将其保存到 `%USERPROFILE%\.cargo\config.toml` 文件（对于系统级配置）或 `.cargo\config.toml`（对于项目级配置）。

   建议使用凭证提供程序 `cargo:token`，该提供程序使用存储在 `~/.cargo/credentials.toml` 文件中的凭证。如果您使用 `cargo:token-from-stdout`，在 `cargo publish` 期间可能会遇到错误，因为 Cargo 客户端在 `cargo publish` 期间未正确修剪授权令牌。

   ```
   [registries.my_registry]
   index = "sparse+https://my_domain-111122223333.d.codeartifact.us-west-2.amazonaws.com/cargo/my_repo/"
   credential-provider = "cargo:token"
   
   [registry]
   default = "my_registry"
   
   [source.crates-io]
   replace-with = "my_registry"
   ```

1. 要使用 Windows 将 Cargo 程序包发布到您的存储库，必须使用 CodeArtifact `get-authorization-token` 命令和 Cargo `login` 命令来获取授权令牌和您的凭证。
   + 将 *my\$1registry* 替换为 `[registries.my_registry]` 中定义的注册表名称。
   + 将 *my\$1domain* 替换为您的 CodeArtifact 域名。
   + 将 *111122223333* 替换为域所有者的 AWS 账户 ID。如果您要访问您拥有的域中的存储库，则无需包括 `--domain-owner`。有关更多信息，请参阅 [跨账户域](domain-overview.md#domain-overview-cross-account)。

   ```
   aws codeartifact get-authorization-token --domain my_domain --domain-owner 111122223333 --region us-west-2 --query authorizationToken --output text | cargo login --registry my_registry
   ```
**注意**  
生成的授权令牌有效期为 12 小时。如果自创建令牌以来已过去 12 小时，则需要创建一个新的令牌。

------

前面示例中的 `[registries.my_registry]` 部分定义了一个包含 `my_registry` 并提供 `index` 和 `credential-provider` 信息的注册表。
+ `index` 为您的注册表指定索引的 URL，这是以 `/` 结尾的 CodeArtifact 存储库端点。对于不是 Git 存储库的注册表，需要使用 `sparse+` 前缀。
**注意**  
要使用双堆栈端点，请使用 `codeartifact.region.on.aws` 端点。
+ `credential-provider` 指定给定注册表的凭证提供程序。如果未设置 `credential-provider`，则将使用 `registry.global-credential-providers` 中的提供程序。通过将 `credential-provider` 设置为 `cargo:token-from-stdout`，当从 CodeArtifact 存储库发布或下载时，Cargo 客户端会自动获取新的授权令牌，因此您无需每 12 小时手动刷新授权令牌。

`[registry]` 部分定义了使用的默认注册表。
+ `default` 指定 `[registries.my_registry]` 中定义的注册表的名称，当从 CodeArtifact 存储库发布或下载时，默认使用该名称。

`[source.crates-io]` 部分定义了未指定注册表时使用的默认注册表。
+ `replace-with = "my_registry"` 将公有注册表 crates.io 替换为 `[registries.my_registry]` 中定义的 CodeArtifact 存储库。如果您需要从外部连接（例如 crates.io）请求程序包，则建议采用此配置。

  要获得 CodeArtifact 的所有好处，例如防止依赖项混淆攻击的程序包来源控制，建议使用源代码替换。使用源代码替换后，CodeArtifact 会代理向外部连接发出的所有请求，并将程序包从外部连接复制到您的存储库。如果不使用源代码替换，Cargo 客户端将根据项目的 `Cargo.toml` 文件中的配置直接检索程序包。如果某个依赖项未使用 `registry=my_registry` 进行标记，Cargo 客户端将直接从 crates.io 中检索该依赖项，而不会与您的 CodeArtifact 存储库进行通信。
**注意**  
如果您最初使用源代码替换，但更新配置文件后不使用源代码替换，则可能会遇到错误。相反的情况也可能会导致错误。因此，建议避免更改项目的配置。

## 安装 Cargo crate
<a name="install-cargo-crates"></a>

使用以下过程从 CodeArtifact 存储库或 [crates.io](https://crates.io/) 安装 Cargo crate。

### 从 CodeArtifact 安装 Cargo crate
<a name="install-cargo-crates-aca"></a>

可以使用 Cargo（`cargo`）CLI 从 CodeArtifact 存储库快速安装特定版本的 Cargo crate。

**使用 `cargo` 从 CodeArtifact 存储库安装 Cargo crate**

1. 如果还没有配置，请按照[在 CodeArtifact 中配置和使用 Cargo](#configure-use-cargo) 中的步骤将 `cargo` CLI 配置为通过适当的凭证来使用 CodeArtifact 存储库。

1. 使用以下命令从 CodeArtifact 安装 Cargo crate：

   ```
   cargo add my_cargo_package@1.0.0
   ```

   有关更多信息，请参阅《The Cargo Book》**中的 [cargo add](https://doc.rust-lang.org/cargo/commands/cargo-add.html)。

## 将 Cargo crate 发布到 CodeArtifact
<a name="publish-cargo-crates"></a>

按照以下步骤，使用 `cargo` CLI 将 Cargo crate 发布到 CodeArtifact 存储库。

1. 如果还没有配置，请按照[在 CodeArtifact 中配置和使用 Cargo](#configure-use-cargo) 中的步骤将 `cargo` CLI 配置为通过适当的凭证来使用 CodeArtifact 存储库。

1. 使用以下命令将 Cargo crate 发布到 CodeArtifact 存储库：

   ```
   cargo publish
   ```

   有关更多信息，请参阅《The Cargo Book》**中的 [cargo publish](https://doc.rust-lang.org/cargo/commands/cargo-publish.html)。

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

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

**Contents**
+ [

## 需要访问注册表的受支持命令
](#supported-commands-access-the-registry)
+ [

## 不受支持的命令
](#unsupported-commands)

## 需要访问注册表的受支持命令
<a name="supported-commands-access-the-registry"></a>

此部分列出了 Cargo 命令，其中 Cargo 客户端需要能够访问其已进行了配置的注册表。这些命令已经过验证，在针对 CodeArtifact 存储库调用时可以正常运行。


****  

| 命令 | 说明 | 
| --- | --- | 
|   [build](https://doc.rust-lang.org/cargo/commands/cargo-build.html)   |  构建本地程序包及其依赖项。  | 
|   [check](https://doc.rust-lang.org/cargo/commands/cargo-check.html)   |  检查本地程序包及其依赖项是否有错误。  | 
|   [获取](https://doc.rust-lang.org/cargo/commands/cargo-fetch.html)   |  获取程序包的依赖项。  | 
|   [publish](https://doc.rust-lang.org/cargo/commands/cargo-publish.html)   |  将程序包发布到注册表。  | 

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

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


****  

| 命令 | 说明 | 
| --- | --- | 
|   [owner](https://doc.rust-lang.org/cargo/commands/cargo-owner.html)   |  在注册表中管理 crate 的所有者。  | 
|   [search](https://doc.rust-lang.org/cargo/commands/cargo-search.html)   |  在注册表中搜索程序包。  | 