---
url: /zh/artifact/cargo.md
description: |
  介绍如何配置和使用 CNB Cargo 制品库， 包括凭据配置、本地开发和流水线中推送/拉取 Rust 包的方法。
---
## 配置凭据

在当前项目下更新 `.cargo/config.toml` 文件，添加以下内容：

```toml
[registry]
default = "cnb-cargo-repo"
global-credential-providers = ["cargo:token"]

[registries.cnb-cargo-repo]
index = "sparse+<CNB_CARGO_URL>"
```

使用以下命令配置凭据：

```shell
echo ${CNB_TOKEN} | cargo login --registry cnb-cargo-repo
```

获取 `<CNB_CARGO_URL>`，参考 [获取制品库地址](./intro.md#获取制品库的地址)。

获取 `<CNB_TOKEN>`，参考 [创建访问令牌](./intro.md#创建访问令牌)。

## 推送制品

### 本地命令行推送

1. 按上文 [配置凭据](#pei-zhi-ping-ju)完成设置

2. 执行以下命令发布到 CNB：

```shell
cargo publish
```

### 云原生构建中推送

在仓库中完成 `.cargo/config.toml` 配置（参考上文 [配置凭据](#pei-zhi-ping-ju)），提交到代码仓库后，推送 Tag 触发构建：

```yaml title=".cnb.yml"
$:
  tag_push:
    - docker:
        image: docker.cnb.cool/examples/language/rust-1.87
      stages:
        - name: update version
          script: sed -i "s#^version = .*#version = \"${CNB_BRANCH}\"#" Cargo.toml
        - name: cargo login
          script: echo ${CNB_TOKEN} | cargo login --registry cnb-cargo-repo
        - name: cargo publish
          script: cargo publish --allow-dirty
```

流水线中 `update version` 步骤会自动将 Tag 值写入 `Cargo.toml` 的 version 字段。

### 云原生开发中推送

1. 粘贴以下内容到 `.cnb.yml`，提交到代码仓库后，点击代码仓库页面右上角「云原生开发」按钮进入开发环境：

```yaml title=".cnb.yml"
$:
  vscode:
    - docker:
        image: docker.cnb.cool/examples/language/rust-1.87
      services:
        - vscode
        - docker
```

2. 按上文 [配置凭据](#pei-zhi-ping-ju)完成设置，更新 `Cargo.toml` 的 version 字段，然后发布：

```shell
cargo publish
```

## 使用制品

### 拉取制品

按上文 [配置凭据](#pei-zhi-ping-ju)完成设置后，使用以下命令拉取制品：

```shell
cargo add rand
```

### 撤回/取消撤回制品

```shell
cargo yank my-crate@0.1.0
cargo yank my-crate@0.1.0 --undo
```

### 删除制品

Cargo 没有提供删除命令，请参考 [删除制品](./intro.md#删除制品)。

## FAQ

### Q1：如何配置全局凭据

全局配置路径如下：

Windows：`%USERPROFILE%\.cargo\config.toml`

Unix：`$HOME/.cargo/config.toml`

更多用法，查阅 [Cargo 官方文档](https://doc.rust-lang.org/cargo/reference/config.html)。

### Q2：Cargo 版本要求

推荐使用 Cargo 1.73.0 及以上版本。

1.73.0 以下版本对私有仓库支持不完善，部分场景下无法携带凭证，会导致认证失败。

### Q3：向 CNB 上传开源包时，提示制品版本已存在

CNB 默认代理了官方源。当服务端不存在某个包时，会从代理源自动提供给 Cargo 客户端，导致客户端误以为 CNB 已存在该包。

解决方法是先上传一个不存在的版本作为占位，然后再上传正确的版本。
