没有单元测试

打包一个仅标头的库,而无需在Conan中为其构建和运行单元测试,可以通过一个非常简单的方法完成。 假设您的配方位于源repo根文件夹中,并且标题位于名为include的子文件夹中,则可以执行以下操作:

  1. from conans import ConanFile
  2. class HelloConan(ConanFile):
  3. name = "Hello"
  4. version = "0.1"
  5. # No settings/options are necessary, this is header only
  6. exports_sources = "include/*"
  7. no_copy_source = True
  8. def package(self):
  9. self.copy("*.h")

如果要打包外部存储库,则可以使用source()方法进行克隆或下载,而不是使用export_sources字段。

  • 不需要设置,因为更改它们不会影响最终的软件包工件
  • 不需要build()方法,因为不会构建仅标头
  • 不需要自定义package_info()方法。 默认的已经将一个”include”子文件夹添加到include路径
  • no_copy_source = True将禁用源文件夹到构建目录的复制,因为不需要这样做,因为configure()或build()方法根本不会修改源代码。
  • 请注意,此配方没有其他依赖项,设置或选项。 如果其中有一个,那么添加package_id()方法将非常方便,以确保仅创建一个始终具有相同ID的程序包,而与配置和依赖项无关:
    1. def package_id(self):
    2. self.info.header_only()
    包创建时使用:
    1. $ conan create . user/channel

包含单元测试

如果要在打包时运行库单元测试,则需要以下方法:

  1. from conans import ConanFile, CMake
  2. class HelloConan(ConanFile):
  3. name = "Hello"
  4. version = "0.1"
  5. settings = "os", "compiler", "arch", "build_type"
  6. exports_sources = "include/*", "CMakeLists.txt", "example.cpp"
  7. no_copy_source = True
  8. def build(self): # this is not building a library, just tests
  9. cmake = CMake(self)
  10. cmake.configure()
  11. cmake.build()
  12. cmake.test()
  13. def package(self):
  14. self.copy("*.h")
  15. def package_id(self):
  16. self.info.header_only()

:::info Tip
如果您要交叉构建库或应用,则可能需要跳过单元测试,因为目标二进制文件无法在当前的构建主机中执行。 为此,您可以将tools.get_env()与CONAN_RUN_TESTS环境变量结合使用,该环境变量在配置文件中被定义为False以进行交叉构建,并将cmake.test()替换为:

  1. if tools.get_env("CONAN_RUN_TESTS", True):
  2. cmake.test()

:::

它将在根文件夹中使用CMakeLists.txt文件:

  1. project(Package CXX)
  2. cmake_minimum_required(VERSION 2.8.12)
  3. include_directories("include")
  4. add_executable(example example.cpp)
  5. enable_testing()
  6. add_test(NAME example
  7. WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/bin
  8. COMMAND example)

还有一些example.cpp文件,这将是我们对该库的”单元测试”:

  1. #include <iostream>
  2. #include "hello.h"
  3. int main() {
  4. hello();
  5. }
  • 这将使用由Conan设置(在命令行或配置文件中)配置的不同的编译器和版本,但是将始终仅生成1个输出包,并且始终使用相同的ID。
  • 单元测试的必需文件也必须是export_sources(或从source()方法检索)
  • 如果程序包有依赖包(requires),则需要通过将generators=”cmake”添加到程序包配方中,并将conanbuildinfo.cmake文件添加到测试CMakeLists.txt中:
  1. include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)
  2. conan_basic_setup()
  3. add_executable(example example.cpp)
  4. target_link_libraries(example ${CONAN_LIBS}) # not necessary if dependencies are also header-only

包创建时使用:

  1. $ conan create . user/channel

:::info Note
有/无测试是指在库上运行完整的整体测试,这与检查程序包完整性的测试功能不同。 上面的示例描述了在配方中对库进行单元测试的方法。 无论哪种情况,建议都拥有一个test_package文件夹,因此,conan create 命令会在创建软件包后检查该软件包。 查看包装入门指南 :::