---
url: /zh/artifact/conan.md
description: 介绍如何配置和使用 CNB Conan 制品库，用于存储和分发 C/C++ 软件包，包括本地开发和流水线集成方法。
---
Conan 制品库用于存储和分发 C/C++ 软件包，支持上传、管理和安装各类 C/C++ 第三方库与工具。

## 前置准备

1. [创建制品库](./intro.md#创建制品库)
2. [获取制品库的地址](./intro.md#获取制品库的地址)
3. [创建令牌](./intro.md#创建访问令牌)

## 本地开发

### 添加远程仓库并登录

`<REMOTE_NAME>` 为远程仓库名称，`<REPO_URL>` 为远程仓库地址。

```shell
conan remote add <REMOTE_NAME> <REPO_URL>
conan remote login -p <YOUR_TOKEN> <REMOTE_NAME> cnb
```

### 拉取制品

```shell
conan download <PACKAGE_NAME> -r <REMOTE_NAME>
```

### 推送制品

```shell
conan create . --user=<USER> --channel=<CHANNEL>
conan upload <PACKAGE_NAME> -r <REMOTE_NAME>
```

## 云原生构建

云原生构建使用令牌有两种方式，参考 [云原生构建、云原生开发中使用令牌](./intro.md#在云原生构建，云原生开发中使用令牌)。

### 配置凭据、拉取与推送

以下示例使用 `CNB_TOKEN`（推荐方式）将凭据配置、拉取和推送合并到一个流水线中。
如需使用密钥仓库文件，参考 [云原生构建、云原生开发中使用令牌](./intro.md#在云原生构建，云原生开发中使用令牌)。

> 下面的流水线示例已将凭据配置作为首个 stage，可直接复制使用。
> 如需将凭据配置拆分到独立流水线中复用，可参考 [include](../build/grammar.md#include) 语法。

```yaml title=".cnb.yml"
main:
  push:
    - docker:
        image: docker.cnb.cool/examples/language/gcc-13.4
      stages:
        - name: 配置 conan 凭据
          script:
            - conan remote add cnb-conan-repo https://conan.cnbprod.alpha.qq.com/cnb/conan-repo/-/packages/
            - conan remote login -p ${CNB_TOKEN} cnb-conan-repo ${CNB_TOKEN_USER_NAME}
        - name: 构建 conan 制品
          script: conan create . --user=test-user --channel=test-channel
        - name: 推送 conan 制品
          script: conan upload my-project/1.0.0@test-user/test-channel -r cnb-conan-repo
        - name: 拉取 conan 制品
          script: conan download my-project/1.0.0@test-user/test-channel -r cnb-conan-repo
```

拉取与推送如需独立使用，可将对应 stage 拆分到不同流水线中。

## 云原生开发

### 前置准备

请在 .cnb.yml 文件中添加以下配置：

```yaml title=".cnb.yml"
$:
  vscode:
    - docker:
        image: docker.cnb.cool/examples/language/gcc-13.4
      services:
        - vscode
        - docker
      imports:
        - <SECRET_REPO_URL>
```

### 添加远程仓库并登录

使用内置 `CNB_TOKEN`（推荐）：

```shell
conan remote add cnb-conan-repo https://conan.cnbprod.alpha.qq.com/cnb/conan-repo/-/packages/
conan remote login -p ${CNB_TOKEN} cnb-conan-repo ${CNB_TOKEN_USER_NAME}
```

### 拉取制品

```shell
conan download <PACKAGE_NAME> -r <REMOTE_NAME>
```

### 编译及推送制品

```shell
conan create . --user=<USER> --channel=<CHANNEL>
conan upload <PACKAGE_NAME> -r <REMOTE_NAME>
```

## FAQ

### Q: 为什么使用 Conan 1.X 无法推送制品到 CNB Conan 制品库？

A: 不支持 Conan 1.X 的旧版协议。如需使用 Conan 1.X 推送，
请先执行 `export CONAN_REVISIONS_ENABLED=True` 启用修订开关，再尝试推送。

### Q: 为什么上传时返回 409 错误？

A: 当前仅支持保留单个 recipe 修订版本和单个 package 修订版本。推送其他修订版本将被视为覆盖操作，
请将制品仓库的版本覆盖策略设置为「允许覆盖已有版本」，或修改包版本后重试。

### Q: 为什么上传时返回 400 错误？

A: 通常是制品名称不符合 Conan 2 规范，请检查后重试。

## 更多信息

更多 Conan 用法请参阅 [官方文档](https://docs.conan.io/)。
