没有单元测试
打包一个仅标头的库,而无需在Conan中为其构建和运行单元测试,可以通过一个非常简单的方法完成。 假设您的配方位于源repo根文件夹中,并且标题位于名为include的子文件夹中,则可以执行以下操作:
from conans import ConanFile
class HelloConan(ConanFile):
name = "Hello"
version = "0.1"
# No settings/options are necessary, this is header only
exports_sources = "include/*"
no_copy_source = True
def 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, CMake
class HelloConan(ConanFile):
name = "Hello"
version = "0.1"
settings = "os", "compiler", "arch", "build_type"
exports_sources = "include/*", "CMakeLists.txt", "example.cpp"
no_copy_source = True
def build(self): # this is not building a library, just tests
cmake = 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 example
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/bin
COMMAND 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
命令会在创建软件包后检查该软件包。 查看包装入门指南
:::