---
url: /zh/artifact/conan.md
---
Conan 制品库是用于存储和分发 C/C++ 软件包的仓库，开发者可以通过它上传、管理和安装各种 C/C++ 第三方库和工具

## 前置准备

1. [创建制品库](./intro.md#创建制品库)

2. [获取制品库的地址](./intro.md#获取制品库的地址)

3. [创建令牌](./intro.md#创建访问令牌)

## 本地开发

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

```shell
# REMOTE_NAME 您的远程仓库名称
# REPO_URL 您的远程仓库地址
# 示例: conan remote add cnb-conan-repo https://conan.cnb.share.ralphlauren.cn/cnb/conan-repo/-/packages/
conan remote add <REMOTE_NAME> <REPO_URL>

# 示例 remote login -p my-token cnb-conan-repo cnb
conan remote login -p <YOUR_TOKEN> <REMOTE_NAME> cnb
```

### 拉取制品

```shell
# 示例: conan download zlib/1.3.1 -r cnb-conan-repo
conan download <PACKAGE_NAME> -r <REMOTE_NAME>
```

### 推送制品

```shell

# 示例1: conan create . 
# 示例2: conan create . --user=test-user --channel=test-channel
conan create . --user=<USER> --channel=<CHANNEL>

# 示例1: conan upload my-project/1.0.0 -r cnb-conan-repo (没有 user 与 channel)
# 示例2: conan upload my-project/1.0.0@test-user/test-channel -r cnb-conan-repo (存在 user 与 channel)
conan upload <PACKAGE_NAME> -r <REMOTE_NAME>
```

## 云原生构建

### 拉取制品

* 方案1: 使用内置的 CNB\_TOKEN 环境变量:

```yaml title=".cnb.yml"
master:
  push:
    - docker:
        image: docker.cnb.cool/examples/language/gcc-13.4
      stages:
        - name: 配置 conan 仓库凭据
          script:
            # 示例: conan remote add cnb-conan-repo https://conan.cnb.share.ralphlauren.cn/cnb/conan-repo/-/packages/
            - conan remote add <REMOTE_NAME> <REPO_URL>
            # 示例 remote login -p ${CNB_TOKEN} cnb-conan-repo ${CNB_TOKEN_USER_NAME}
            - conan remote login -p ${CNB_TOKEN} <REMOTE_NAME> ${CNB_TOKEN_USER_NAME}
        - name: 拉取 conan 制品
          script:
            # 示例 conan download zlib/1.3.1 -r cnb-conan-repo
            - conan download <PACKAGE_NAME> -r <REMOTE_NAME>
```

* 方案2: 使用密钥仓库文件:

```yaml title=".cnb.yml"
master:
  push:
    - docker:
        image: docker.cnb.cool/examples/language/gcc-13.4
      import:
        # 引入密钥仓库配置文件
        - <SECRET_REPO_URL>
      stages:
        - name: 配置 conan 仓库凭据
          script:
            - conan remote add <REMOTE_NAME> <REPO_URL>
            - conan remote login -p <PASS_WORD> <REMOTE_NAME> <USER_NAME>
        - name: 拉取 conan 制品
          script:
            - conan download <PACKAGE_NAME> -r <REMOTE_NAME>
```

示例:

```yaml title=".cnb.yml"
master:
  push:
    - docker:
        image: docker.cnb.cool/examples/language/gcc-13.4
      import:
        - https://cnb.share.ralphlauren.cn/cnb-demo/env-demo/-/blob/main/envs/env.yml
      stages:
        - name: 配置 conan 仓库凭据
          script:
            - conan remote add cnb-conan-repo https://conan.cnb.share.ralphlauren.cn/cnb/conan-repo/-/packages/
            # 引入密钥仓库配置文件，以环境变量的形式注入 USER_NAME 和 PASS_WORD 的值
            - conan remote login -p ${PASS_WORD} cnb-conan-repo ${USER_NAME}
        - name: 拉取 conan 制品
          script:
            - conan download zlib/1.3.1 -r cnb-conan-repo
```

### 推送制品

* 方案1: 使用内置的 CNB\_TOKEN 环境变量:

```yaml title=".cnb.yml"
master:
  push:
    - docker:
        image: docker.cnb.cool/examples/language/gcc-13.4
      stages:
        - name: 配置 conan 仓库凭据
          script:
            # 示例: conan remote add cnb-conan-repo https://conan.cnb.share.ralphlauren.cn/cnb/conan-repo/-/packages/
            - conan remote add <REMOTE_NAME> <REPO_URL>
            # 示例 remote login -p ${CNB_TOKEN} cnb-conan-repo ${CNB_TOKEN_USER_NAME}
            - conan remote login -p ${CNB_TOKEN} <REMOTE_NAME> ${CNB_TOKEN_USER_NAME}
        - name: 构建 conan 制品
          script:
             # 示例: conan create . --user=test-user --channel=test-channel
            - conan create . --user=<USER> --channel=<CHANNEL>
        - name: 推送 conan 制品
          script:
            # 示例: conan upload my-project/1.0.0@test-user/test-channel -r cnb-conan-repo
            - conan upload <PACKAGE_NAME> -r <REMOTE_NAME>
```

* 方案2: 使用密钥仓库文件:

```yaml title=".cnb.yml"
master:
  push:
    - docker:
        image: docker.cnb.cool/examples/language/gcc-13.4
      import:
        # 引入密钥仓库配置文件
        - <SECRET_REPO_URL>  
      stages:
        - name: 配置 conan 仓库凭据
          script:
            - conan remote add <REMOTE_NAME> <REPO_URL>
            - conan remote login -p <PASS_WORD> <REMOTE_NAME> <USER_NAME>
        - name: 构建 conan 制品
          script:
            - conan create . --user=<USER> --channel=<CHANNEL>
        - name: 推送 conan 制品
          script:
            - conan upload <PACKAGE_NAME> -r <REMOTE_NAME>
```

示例：

```yaml title=".cnb.yml"
master:
  push:
    - docker:
        image: docker.cnb.cool/examples/language/gcc-13.4
      import:
        - https://cnb.share.ralphlauren.cn/cnb-demo/env-demo/-/blob/main/envs/env.yml  
      stages:
        - name: 配置 conan 仓库凭据
          script:
            - conan remote add cnb-conan-repo https://conan.cnb.share.ralphlauren.cn/cnb/conan-repo/-/packages/
            # 引入密钥仓库配置文件，以环境变量的形式注入 USER_NAME 和 PASS_WORD 的值
            - conan remote login -p ${PASS_WORD} cnb-conan-repo ${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
```

## 云原生开发

### 前置准备工作

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

```yaml title=".cnb.yml"
$:
  vscode:
    - docker:
        image: docker.cnb.cool/examples/language/gcc-13.4
      services:
        - vscode
        - docker
      # 使用密钥仓库文件则需要填入以下配置  
      imports:
        # 示例: https://cnb.share.ralphlauren.cn/cnb-demo/env-demo/-/blob/main/envs/env.yml
        - <SECRET_REPO_URL>
```

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

* 方案1: 使用内置的 CNB\_TOKEN 环境变量

```shell
# REMOTE_NAME 您的远程仓库名称
# REPO_URL 您的远程仓库地址
# 示例: conan remote add cnb-conan-repo https://conan.cnb.share.ralphlauren.cn/cnb/conan-repo/-/packages/
conan remote add <REMOTE_NAME> <REPO_URL>

# 示例 remote login -p ${CNB_TOKEN} cnb-conan-repo ${CNB_TOKEN_USER_NAME}
conan remote login -p ${CNB_TOKEN} <REMOTE_NAME> ${CNB_TOKEN_USER_NAME}
```

* 方案2: 使用密钥仓库文件

```shell
# REMOTE_NAME 您的远程仓库名称
# REPO_URL 您的远程仓库地址
# 示例: conan remote add cnb-conan-repo https://conan.cnb.share.ralphlauren.cn/cnb/conan-repo/-/packages/
conan remote add <REMOTE_NAME> <REPO_URL>

# 引入密钥仓库配置文件，以环境变量的形式注入 USER_NAME 和 PASS_WORD 的值
# 示例 remote login -p ${PASS_WORD} cnb-conan-repo ${USER_NAME}
conan remote login -p ${PASS_WORD} <REMOTE_NAME> ${USER_NAME}
```

### 拉取制品

```shell
# 示例: conan download zlib/1.3.1 -r cnb-conan-repo
conan download <PACKAGE_NAME> -r <REMOTE_NAME>
```

### 编译及推送制品

```shell
# 示例1: conan create . 
# 示例2: conan create . --user=test-user --channel=test-channel
conan create . --user=<USER> --channel=<CHANNEL>

# 示例1: conan upload my-project/1.0.0 -r cnb-conan-repo (没有 user 与 channel)
# 示例2: conan upload my-project/1.0.0@test-user/test-channel -r cnb-conan-repo (存在 user 与 channel)
conan upload <PACKAGE_NAME> -r <REMOTE_NAME>
```

## FAQ

### Q:为什么我使用 conan1.X 无法将制品推送至 cnb conan 制品库中

A: 我们不支持 conan1.X 的旧版协议，如果您需要使用 conan1.X 版本推送，请执行 `export CONAN_REVISIONS_ENABLED=True` 命令打开修订开关后，再进行推送

### Q:为什么我上传时会报 409 的错误

A: 目前我们仅支持存储单个 recipe 修订版本和单个 package 修订版本，推送其它修订版本的 recipe 和 package 会被视为 `覆盖` 操作，请将您制品仓库的`版本覆盖策略`设置为`允许覆盖已有版本`，或者更改当前包的版本，再推送即可

### Q:为什么我上传时会报 400 的错误

A: 这种情况一般是您的制品名称不符合 conan2 的规范，请您检查并处理后再进行上传操作

## 更多用法

更多 conan 用法，请查阅官方文档
