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

如何让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)

请问:

  1. 如何在测试包中添加主包作为依赖?
  2. 添加后是否能在测试包的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 00:46:02