---
url: /zh/artifact/cargo.md
---
## 配置凭据

在当前项目下更新 `.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#创建访问令牌)

## 推送制品

::: tabs
@tab 本地命令行推送

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

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

```shell
cargo publish
```

@tab 云原生构建中推送

1.粘贴以下内容到 `.cnb.yaml`, 提交到代码仓库

```yaml title=".cnb.yml"
$:
  tag_push:
    - docker:
        image: docker.cnb.cool/examples/language/rust-1.87
      stages:
        - name: 配置认证凭据
          script: echo ${CNB_TOKEN} | cargo login
        - name: 发布到 CNB
          script: cargo publish --allow-dirty
```

2.更新代码仓库中 `.cargo/config.toml` 文件, 添加以下行. `<CNB_CARGO_URL>` 请参考[获取制品库地址](./intro.md#获取制品库的地址)

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

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

3.更新代码仓库中 `Cargo.toml` 文件的 version 字段

```toml
[package]
name = "<PACKAGE_NAME>"
version = "<VERSION>"
```

4.提交一个 Tag, 将会触发云原生构建

@tab 云原生开发中推送

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

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

2.按照上文 [配置凭据](#pei-zhi-ping-ju)

3.更新代码仓库中 `Cargo.toml` 文件的 version 字段

```toml
[package]
name = "<PACKAGE_NAME>"
version = "<VERSION>"
```

4.发布到 CNB

```shell
cargo publish
```

:::

## 使用制品

### 拉取制品

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

```shell
# 以 rand 举例
cargo add rand
```

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

```shell
# 撤回制品
cargo yank my-crate@0.1.0
# 取消撤回制品
cargo yank my-crate@0.1.0 --undo
```

### 删除制品

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

## FQA

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

全局配置路径如下:

windows: `%USERPROFILE%\.cargo\config.toml`

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

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

### Q2: cargo 版本要求

推荐使用 1.73.0 及以上 cargo 版本

因为 1.73.0 以下版本对私有仓库支持不是很好, 在某些场景无法携带上凭证, 导致认证失败

### Q3: 将开源包上传到 CNB 时, 提示制品版本已存在

这是因为 CNB 默认代理了官方源, 服务端不存在这个包时, 会自动从代理提供这个包给 cargo 客户端.

导致 cargo 客户端误以为 CNB 已存在这个包.

要解决这个问题, 可以先上传一个不存在的版本占位. 然后再上传一次正确的版本即可.
