You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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且操作繁琐),现咨询:

  1. 为何--build=never参数未被遵守?
  2. 为何使用相同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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 00:57:04