Conan 包查找必须严格按 remote 顺序、显式声明 channel、profile 隔离及 CMake 配置对齐,否则默认 fallback 到 conancenter;需用 -i 指定远程优先级、requires 写全 user/channel、set(CMAKE_FIND_PACKAGE_PREFER_CONFIG ON) 并禁用系统 Find 模块。

Conan 默认会按远程仓库注册顺序查找包,内部依赖必须显式前置、路径优先、profile 隔离,否则容易被 conancenter 覆盖。
conan remote add --force 时必须指定 -i 参数控制优先级
Conan 查找包的顺序严格按 conan remote list 输出的序号从上到下。即使你用 conan remote add my-internal https://artifactory.internal/conan 加了内网仓库,它默认排在末尾,zlib/1.2.13 这类通用包仍会先命中 conancenter。
- 正确做法是加
-i 0把它插到第一位:conan remote add --force -i 0 my-internal https://artifactory.internal/conan - 如果已有多个远程,用
conan remote update my-internal --index 0调整位置 - CI 环境中建议每次
conan install前都执行一次conan remote list校验顺序,避免因缓存或配置漂移导致 fallback 到公网
conanfile.py 中 requires 必须写全 user/channel 才能绕过 conancenter 搜索
只写 "zlib/1.2.13" 会让 Conan 先去 conancenter 查是否有预编译二进制;即使你内网有同名包,只要没带 channel,它不会主动查你的远程。
- 内部包必须显式声明 channel:
"zlib/1.2.13@myteam/stable"或"zlib/1.2.13@local/testing" - 若想复用 conancenter 的包但优先走镜像,得配
conan remote add --force --index 0 conancenter-mirror https://mirror.internal/conancenter,再确保该镜像已同步目标版本 - 注意:Conan 2.x 不再支持
@后省略 channel 的写法(如zlib/1.2.13@),会报错,必须写成zlib/1.2.13@conancenter/或明确 internal channel
CMakeLists.txt 里 find_package() 要禁用系统 Find 模块
即使 Conan 已把内部包装好,CMake 仍可能调用系统自带的 FindZLIB.cmake,尤其在 macOS 或 Linux 上装过 Homebrew / apt 的机器,find_package(ZLIB) 会直接返回系统路径。
- 在
CMakeLists.txt开头加:set(CMAKE_FIND_PACKAGE_PREFER_CONFIG ON) - 确保
conan install用的是CMakeDeps生成器(不是旧版cmake_find_package),它输出的是ZLIBConfig.cmake,而 CMake 会优先加载 Config 模式 - 验证是否生效:构建时加
-DCMAKE_VERBOSE_MAKEFILE=ON,看日志里find_package(ZLIB)是否加载了build/generators/ZLIBConfig.cmake,而不是/usr/share/cmake/Modules/FindZLIB.cmake
profile 必须隔离 internal 和 public 构建环境
一个 profile 混用 internal 包和 conancenter 包,容易因 settings(如 compiler.version)或 options(如 shared=True)不一致,导致 Conan 自动 fallback 到公网找“更匹配”的二进制。
- 为内部依赖单独建 profile:
conan profile new internal --detect,再手动改[options]和[env]适配内网构建机 - install 时强制绑定:
conan install . --profile:build internal --profile:host internal - 切勿在 internal profile 里留
[remote]段——remote 应由conan remote统一管理,profile 只管构建参数
真正麻烦的不是加 internal 远程,而是所有环节——remote 顺序、requires 写法、CMake 查找逻辑、profile 约束——必须全部对齐。漏掉任意一环,Conan 就会安静地退回到 conancenter,连 warning 都不给。


















