conan create 通过 --version 参数显式指定版本号,如 conan create . myuser/stable --version=1.3.0,避免修改 conanfile.py 中的 version 字段;版本号与 user/channel 共同构成唯一包标识,多版本需配合不同 user/channel(如 testing/stable)及 settings 组合管理。

conan create 命令怎么指定不同版本号
你不能靠改 conanfile.py 里的 version 字段再反复跑 conan create 就自动覆盖——Conan 把版本号当作包身份的一部分,name/version@user/channel 整体才是唯一标识。想维护多个版本,必须显式传入不同 version 或用 profile/setting 区分构建变体。
常见做法是:在调用 conan create 时用 --version 覆盖 recipe 中的硬编码值,避免每次手动改文件:
conan create . myuser/testing --version=1.2.0 conan create . myuser/testing --version=1.3.0 conan create . myuser/stable --version=1.3.0
注意:--version 只影响本次构建的包 ID,不影响 recipe 文件本身;如果 recipe 里用了 self.version 动态逻辑(比如读取 VERSION 文件),那得同步维护外部文件。
多版本共存时 user/channel 怎么选
user/channel 不是随便填的,它直接决定包是否能被其他项目稳定引用。乱用会导致依赖解析失败或误拉错版本。
-
myuser/testing:适合开发中频繁迭代的版本,CI 每次 PR 都可推新包,但不推荐在正式项目中requires -
myuser/stable:只放经过验证、语义化版本(如2.1.0)的包,下游项目应锁定这个 channel - 避免用
myuser/dev这类模糊 channel——Conan 不做语义判断,dev和stable对它完全等价,只是字符串
关键点:channel 是人工约定,不是 Conan 的分支机制。别指望 conan install mypkg/1.2.0@myuser/dev 会自动 fallback 到 stable。
如何避免本地缓存里版本混乱
本地 ~/.conan2 缓存默认不区分 user/channel,所有 pkg/1.2.0@user/channel 都按 reference 全路径存。但如果你反复用相同 name/version + 不同 user/channel 创建包,容易在 conan list 输出里看到一堆重复条目,干扰排查。
建议操作:
- 用
conan list "mypkg/1.2.0@*/*"查看所有渠道下的该版本 - 清理特定渠道旧包:
conan remove "mypkg/1.2.0@myuser/testing" --confirm - 不要依赖
conan remove "*"清全量——它会删掉所有包,包括你从 ConanCenter 下的依赖
真正麻烦的是:当两个不同 user/channel 下存在完全相同的 name/version 且二进制内容不同时,Conan 不报错,但下游 conan install 可能随机 pick 到一个(取决于远程仓库返回顺序)。这是最隐蔽的“版本污染”来源。
recipe 里怎么写才能让多版本构建更可靠
硬编码 version = "1.2.0" 在 conanfile.py 里是最脆弱的做法。一旦要打多个 patch 版本(如 1.2.1, 1.2.2),就得反复改文件、提交、触发 CI。
更健壮的方式是把版本交给外部控制:
- 用环境变量驱动:
conan create . myuser/stable --version=$VERSION,配合 CI 的 tag 触发 - 从 Git 标签读取:
self.version = tools.files.load(self, os.path.join(self.recipe_folder, "VERSION")).strip() - 如果用 CMake 构建,可复用
CMAKE_PROJECT_VERSION,通过conf传入:conan create . myuser/stable -c tools.build:compiler_version=12
还有个容易被忽略的点:settings 和 options 也参与版本哈希计算。哪怕 version 相同,只要 -s compiler.version=11 和 -s compiler.version=12 同时存在,Conan 就认为是两个不同包——这正是多编译器/多架构支持的基础,但也意味着你得明确管理哪些 setting 组合是“有效版本”。











