没有单元测试
打包一个仅标头的库,而无需在Conan中为其构建和运行单元测试,可以通过一个非常简单的方法完成。 假设您的配方位于源repo根文件夹中,并且标题位于名为include的子文件夹中,则可以执行以下操作:
from conans import ConanFileclass HelloConan(ConanFile):name = "Hello"version = "0.1"# No settings/options are necessary, this is header onlyexports_sources = "include/*"no_copy_source = Truedef package(self):self.copy("*.h")
如果要打包外部存储库,则可以使用source()方法进行克隆或下载,而不是使用export_sources字段。
- 不需要设置,因为更改它们不会影响最终的软件包工件
- 不需要build()方法,因为不会构建仅标头
- 不需要自定义package_info()方法。 默认的已经将一个”include”子文件夹添加到include路径
- no_copy_source = True将禁用源文件夹到构建目录的复制,因为不需要这样做,因为configure()或build()方法根本不会修改源代码。
- 请注意,此配方没有其他依赖项,设置或选项。 如果其中有一个,那么添加package_id()方法将非常方便,以确保仅创建一个始终具有相同ID的程序包,而与配置和依赖项无关:
包创建时使用:def package_id(self):self.info.header_only()
$ conan create . user/channel
包含单元测试
如果要在打包时运行库单元测试,则需要以下方法:
from conans import ConanFile, CMakeclass HelloConan(ConanFile):name = "Hello"version = "0.1"settings = "os", "compiler", "arch", "build_type"exports_sources = "include/*", "CMakeLists.txt", "example.cpp"no_copy_source = Truedef build(self): # this is not building a library, just testscmake = CMake(self)cmake.configure()cmake.build()cmake.test()def package(self):self.copy("*.h")def package_id(self):self.info.header_only()
:::info
Tip
如果您要交叉构建库或应用,则可能需要跳过单元测试,因为目标二进制文件无法在当前的构建主机中执行。 为此,您可以将tools.get_env()与CONAN_RUN_TESTS环境变量结合使用,该环境变量在配置文件中被定义为False以进行交叉构建,并将cmake.test()替换为:
if tools.get_env("CONAN_RUN_TESTS", True):cmake.test()
:::
它将在根文件夹中使用CMakeLists.txt文件:
project(Package CXX)cmake_minimum_required(VERSION 2.8.12)include_directories("include")add_executable(example example.cpp)enable_testing()add_test(NAME exampleWORKING_DIRECTORY ${CMAKE_BINARY_DIR}/binCOMMAND example)
还有一些example.cpp文件,这将是我们对该库的”单元测试”:
#include <iostream>#include "hello.h"int main() {hello();}
- 这将使用由Conan设置(在命令行或配置文件中)配置的不同的编译器和版本,但是将始终仅生成1个输出包,并且始终使用相同的ID。
- 单元测试的必需文件也必须是export_sources(或从source()方法检索)
- 如果程序包有依赖包(requires),则需要通过将generators=”cmake”添加到程序包配方中,并将conanbuildinfo.cmake文件添加到测试CMakeLists.txt中:
include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)conan_basic_setup()add_executable(example example.cpp)target_link_libraries(example ${CONAN_LIBS}) # not necessary if dependencies are also header-only
包创建时使用:
$ conan create . user/channel
:::info
Note
有/无测试是指在库上运行完整的整体测试,这与检查程序包完整性的测试功能不同。 上面的示例描述了在配方中对库进行单元测试的方法。 无论哪种情况,建议都拥有一个test_package文件夹,因此,conan create 命令会在创建软件包后检查该软件包。 查看包装入门指南
:::
