Conan 1.x使用--build=never仍触发编译问题咨询
我们的包仅支持Release/Debug两种构建类型,无额外选项。基础包Recipe代码如下:
from conans import ConanFile from conan.tools.cmake import CMakeDeps class Base(ConanFile): name = "base-cmake-pkg" # 仅保留build_type作为配置项,让包与操作系统、架构、编译器无关 settings = "build_type" options = None # 定义默认源码目录 exports_sources = "src/*" # 使用CMakeDeps生成器 generators = "CMakeDeps" def package_info(self): # 将包名转换为CMake偏好的驼峰命名格式 self.cpp_info.name = ''.join( word.title() for word in self.name.replace("-", "_").split('_') ) # 指定库文件所在目录 self.cpp_info.libdirs = ["lib"]
我们期望执行conan install时仅下载二进制包,不触发源码构建,消费包Recipe代码如下:
import pathlib from conans import ConanFile class MyConsumerRecipe(ConanFile): name = "my-comsumer-recipe" version = "0.1.0" settings = "build_type" options = None def requirements(self): self.requires("base-cmake-pkg/1.0.2@xxx/stable") def imports(self): self.copy("*", dst="/path/where/i/want/to/copy/the/content", src="", keep_path=True)
但执行命令$ conan install --build=never .时,输出显示仍在尝试从源码构建:
$ conan install --build=never . ... Building package from source as defined by build_policy='missing' ... Packages base-cmake-pkg/1.0.2@xxx/stable:5169407f8735227b248fa703db6322677006a6f1 - Build Installing (downloading, building) binaries... base-cmake-pkg/1.0.2@xxx/stable: WARN: Build folder is dirty, removing it: ...
我们不想使用conan download(需提前知晓包ID且操作繁琐),现咨询:
- 为何
--build=never参数未被遵守? - 为何使用相同settings=Release仍会触发重新编译?
附目标包的conan inspect输出:
$ conan inspect base-cmake-pkg/1.0.2@xxxx/stable name: base-cmake-pkg version: 1.0.2 url: ... homepage: None license: ... author: ... description: None topics: None generators: CMakeDeps exports: None exports_sources: src/* short_paths: False apply_env: True build_policy: missing revision_mode: hash settings: build_type options: None default_options: None deprecated: None
1. --build=never参数未生效的原因
从conan inspect输出可以看到,基础包的build_policy被设置为missing。这个属性的优先级高于命令行的--build=never参数:当build_policy=missing时,只要对应配置的二进制包不存在,Conan就会自动触发源码构建,完全忽略--build=never的限制。
2. 相同Release配置仍触发编译的原因
首先要确认远程仓库中是否存在对应build_type=Release的二进制包。如果远程没有该包,结合build_policy=missing的设置,Conan会直接启动源码构建。另外,检查消费包与基础包的settings是否完全匹配——虽然你只声明了build_type,但要确保本地环境的隐含配置(如编译器版本、系统架构)没有被Conan自动追加到settings中(不过从基础包Recipe看,已明确仅保留build_type,这部分问题概率较低)。
解决方案
要让--build=never生效,需修改基础包的Recipe,移除build_policy=missing的设置(或显式设置为build_policy=None)。修改后的基础包关键代码如下:
class Base(ConanFile): name = "base-cmake-pkg" settings = "build_type" options = None # 移除或注释掉build_policy=missing # build_policy = "missing" exports_sources = "src/*" generators = "CMakeDeps" # 其他代码保持不变
修改后重新上传基础包到远程仓库,再执行conan install --build=never .时,Conan会严格遵守命令行参数:如果找不到对应二进制包,直接报错,不会触发源码构建。
内容的提问来源于stack exchange,提问作者Gaetan

