logo
0
0
WeChat Login

Conan v2 包推送工具

本目录用于推送 Conan v2 格式的包到远程仓库。

环境要求

  • Conan v2 (2.x)
  • 虚拟环境路径:/Users/silky/Desktop/code/workspace/artifactory/env-conan2
  • Conan2 命令:/Users/silky/Desktop/code/workspace/artifactory/bin/conan2

脚本说明

1. push_v2.sh - 推送自定义包

推送本地 Conan v2 包到远程仓库。

用法

./push_v2.sh -u <URL> -t <TOKEN> [OPTIONS]

必填参数

  • -u, --url URL: 远程仓库 URL
  • -t, --token TOKEN: 访问 token

可选参数

  • -r, --remote NAME: 远程仓库名称(默认: cnb-conan-repo)
  • -n, --name NAME: 包名(默认从 conanfile.py 自动识别)
  • -v, --version VERSION: 版本号(默认从 conanfile.py 自动识别)
  • --username USERNAME: 用户名(默认: cnb)

示例

# 基本用法(自动识别 name 和 version) ./push_v2.sh -u https://conan.cnb-dev.woa.com/silky_dev/conan-cnb-test/-/packages/ \ -t YOUR_TOKEN # 指定 name 和 version ./push_v2.sh -u https://conan.cnb-dev.woa.com/silky_dev/conan-cnb-test/-/packages/ \ -t YOUR_TOKEN -n hello -v 2.0.0

2. push_third_party.sh - 推送三方包

从公共仓库下载三方包并推送到 Conan v2 私有仓库。

用法

./push_third_party.sh -p <PACKAGE> -u <URL> -t <TOKEN> [OPTIONS]

必填参数

  • -p, --package PACKAGE: 包名/版本(格式: name/version)
  • -u, --url URL: 目标仓库 URL
  • -t, --token TOKEN: 目标仓库 token

可选参数

  • -s, --source REMOTE: 源仓库名称(默认: conancenter)
  • -r, --remote NAME: 目标仓库名称(默认: 自动生成)
  • --username USERNAME: 目标仓库用户名(默认: _)
  • --recipe-only: 仅推送 recipe,不推送 binaries

示例

# 推送 zlib/1.3.1 ./push_third_party.sh -p zlib/1.3.1 \ -u https://conan.cnb-dev.woa.com/silky_dev/conan-cnb-test/-/packages/ \ -t YOUR_TOKEN # 推送 boost(仅 recipe) ./push_third_party.sh -p boost/1.84.0 \ -u https://conan.cnb-dev.woa.com/silky_dev/conan-cnb-test/-/packages/ \ -t YOUR_TOKEN --recipe-only

3. batch_push_third_party.sh - 批量推送三方包

批量推送多个三方包。

用法

./batch_push_third_party.sh -f <FILE> -u <URL> -t <TOKEN> [OPTIONS]

包列表文件格式 (packages.txt):

zlib/1.3.1 boost/1.84.0 fmt/10.2.1

示例

./batch_push_third_party.sh -f packages.txt \ -u https://conan.cnb-dev.woa.com/silky_dev/conan-cnb-test/-/packages/ \ -t YOUR_TOKEN

conanfile.py 说明

本目录的 conanfile.py 使用 Conan v2 语法

from conan import ConanFile # 注意是 conan,不是 conans from conan.tools.cmake import CMake, cmake_layout from conan.tools.files import copy class HelloConan(ConanFile): name = "hello" version = "1.0.0" def layout(self): cmake_layout(self) # v2 新增的 layout def package(self): copy(self, "*.h", ...) # v2 使用 tools.files.copy

关键点

  • 导入语句:from conan import ...(v2 使用 conan,v1 使用 conans
  • CMake 工具:from conan.tools.cmake import CMake
  • 文件操作:使用 from conan.tools.files import copy
  • Layout:推荐使用 cmake_layout() 方法

Conan v2 主要变化

1. Reference 格式

  • v1: name/version@user/channel(需要 @)
  • v2: name/version(不需要 @,user/channel 已移除)

2. 命令变化

  • 登录: conan remote login <remote> <user> -p <token> (v1 使用 conan user
  • 创建: conan create . --name=<name> --version=<version> (v1 使用 reference)
  • 上传: conan upload <name/version> -r <remote> -c (v1 使用 --all --confirm

3. 配置文件变化

  • v1: ~/.conan/
  • v2: ~/.conan2/

4. 工具导入变化

# v1 from conans import ConanFile, CMake, tools # v2 from conan import ConanFile from conan.tools.cmake import CMake, cmake_layout from conan.tools.files import copy, get

注意事项

  1. Conan v2 是推荐版本:新项目应该使用 Conan v2
  2. 不向后兼容:v2 与 v1 在语法和命令上有较大变化
  3. 仓库支持:确认目标仓库支持 Conan v2 API
  4. 迁移指南:从 v1 迁移到 v2 需要修改 conanfile.py

故障排查

问题:'user' is not a Conan command

原因:脚本使用了 v1 的 conan user 命令
解决:确认脚本使用的是 conan2 命令,登录改用 conan remote login

问题:conanfile.py 报错

原因:使用了 v1 语法
解决:检查导入语句,应该是 from conan import ...(不是 conans

问题:找不到 cmake_layout

原因:未导入 layout 工具
解决:添加 from conan.tools.cmake import cmake_layout

相关链接