如何让Conan测试包依赖其测试的动态版本主包?
问题描述
我有如下主包Conan recipe:
from conans import ConanFile class MainLibraryPackage(ConanFile): name = 'main' description = 'stub' def set_version(self): self.version = customFunctionToGetVersion() ...
以及对应的测试包Conan recipe:
import os from conans import ConanFile, CMake class MainLibraryTests(ConanFile): """ Conan recipe to run C++ tests for main library """ settings = 'arch', 'build_type', 'os', 'compiler' generators = "cmake" def requirements(self): self.requires("gtest/1.12.1") self.requires(<my main library, somehow?>) def build(self): cmake = CMake(self) cmake.configure() cmake.build() def test(self): print("THIS IS A TEST OF THE TEST") if not tools.cross_building(self): os.chdir("bin") self.run(".%smain_tests" % os.sep)
请问:
- 如何在测试包中添加主包作为依赖?
- 添加后是否能在测试包的CMakeLists.txt中自动填充
CONAN_LIBS变量?
解决方案
1. 测试包添加主包依赖的方式
有两种常用的实现方式:
方式一:直接引用包名与版本
如果主包已经本地构建安装到Conan缓存,或上传到远程仓库,可直接通过包名+版本的形式声明依赖:
def requirements(self): self.requires("gtest/1.12.1") # 替换为你主包实际的版本号,比如从customFunctionToGetVersion()得到的结果 self.requires("main/1.0.0")
如果主包版本是动态生成的,也可以在构建测试包时通过命令行传入版本参数:
conan create . test_package -o main_version=1.0.0
然后在测试包的recipe中读取该参数:
def requirements(self): self.requires("gtest/1.12.1") self.requires(f"main/{self.options.main_version}")
方式二:利用Conan内置的测试关联逻辑
如果测试包放在主包的test_package目录下(Conan推荐的测试结构),可以直接使用内置变量关联主包,无需手动指定版本:
def requirements(self): self.requires("gtest/1.12.1") # 自动关联当前正在测试的主包的完整引用(包名+版本+用户/频道) self.requires(self.tested_reference_str)
这种方式适配主包版本动态变化的场景,灵活性更高。
2. CONAN_LIBS变量的自动填充
只要正确添加主包依赖,且测试包已设置generators = "cmake",Conan会自动在生成的conanbuildinfo.cmake文件中填充CONAN_LIBS变量,包含主包及所有依赖的库文件。
你只需在测试包的CMakeLists.txt中引入该文件,即可直接使用CONAN_LIBS:
include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake) conan_basic_setup() add_executable(main_tests main_tests.cpp) target_link_libraries(main_tests ${CONAN_LIBS})
编译时会自动链接主包和gtest的库文件。
内容的提问来源于stack exchange,提问作者Danny
相关产品推荐
相关产品推荐

