conan create 默认不运行测试包,需显式添加 --test-folder=test_package 参数;测试包目录须含正确 conanfile.py,通过 self.requires(self.tested_reference_str) 声明被测包,并在测试代码中用 self.deps_cpp_info["pkg"].rootpath 验证链接路径。

conan create 时怎么让测试包一起运行
默认 conan create 不会自动构建或运行测试包(test package),它只处理你指定的 conanfile.py 所在目录的包逻辑。测试包是独立的验证环节,必须显式触发。
关键动作是:确保项目根目录下有 test_package/ 子目录,且其中包含有效的 conanfile.py(通常继承 ConanFile,声明 test_type = "explicit" 或使用 python_requires 模板),再加 --test-folder=test_package 参数。
-
conan create . user/channel --test-folder=test_package—— 这是最常用写法,.是你的库 conanfile.py 路径 - 如果
test_package不在默认名,比如叫tp/,就得写全路径:--test-folder=tp - 不加
--test-folder,哪怕目录存在也不会执行;Conan 2.x 之后甚至不再默认查找test_package
test_package/conanfile.py 怎么写才真正调用到你的包
测试包的 conanfile.py 必须通过 requires 声明被测包,且版本要匹配你正在创建的包。常见错误是写死版本(如 "mylib/1.0@user/channel"),但 conan create 构建时实际生成的是带时间戳或 dev 后缀的临时引用。
- 推荐用
self.requires(self.tested_reference_str)—— 这是 Conan 内置变量,自动解析当前conan create的目标引用 -
build_requires一般不用在这里出现;测试包本身不参与被测包构建,只做消费验证 -
generators = ["CMakeDeps", "CMakeToolchain"]要按实际构建系统选,C++ 项目通常需要两者配合生成conan_toolchain.cmake和mylib-release-x86_64-data.cmake - 别漏掉
cmake.configure()和cmake.build()的调用顺序,否则cmake.test()会找不到可执行文件
测试代码里怎么确认链接的是本地刚 build 的包,不是缓存旧版
最直接的方式是在测试代码中输出包的 package_folder 路径,或读取其 conaninfo.txt / conanmanifest.txt 时间戳。但更实用的是利用 Conan 的 self.deps_cpp_info["mylib"].rootpath 获取实际安装路径,并加一句 assert os.path.exists(...) 验证。
- 在
test_package/test_package.cpp里打印:std::cout (前提是 CMake 正确传入了该 define) - 如果链接失败报
undefined reference,大概率是CMakeLists.txt里没调find_package(mylib),或target_link_libraries拼写与set_target_properties(... PROPERTIES INTERFACE_NAME mylib)不一致 - 用
conan install --verbose先单独跑一次测试包目录,看 resolver 输出是否命中你期望的revision(Conan 2.x 默认开启 RREV)
CI 中跑 test package 容易忽略的权限和路径问题
CI 环境(尤其是 Docker 或自建 runner)常因缓存隔离、用户权限或工作目录跳转导致 conan create 找不到 test_package,或测试二进制无法加载共享库。
- 确保 CI 脚本进入的是包源码根目录,不是子目录;
ls -la test_package/应该可见 - Linux 下若测试程序报
error while loading shared libraries: libmylib.so: cannot open shared object file,说明 runtime path 没生效;可在CMakeLists.txt加set(CMAKE_INSTALL_RPATH "$ORIGIN/../lib"),或运行前export LD_LIBRARY_PATH=$(pwd)/build/.../lib - Windows 上注意
vcvarsall.bat是否已调用;MSVC 工具链未激活时,conan create可能静默跳过编译,却仍报告测试“通过”
conan create . --test-folder=test_package --build=missing 从头走完那条链。中间任何一步省略(比如跳过 --build=missing)、路径写错、或 CMakeLists.txt 里硬编码了绝对路径,都会让测试失去意义。











