Conan 2 的新特性

Conan 2 基于过去几年在 Conan 1.X 中获得的经验,进行了许多令人兴奋的改进。此外,还做了大量工作,将必要的东西反向移植到 Conan 1.X,以使升级更容易:使用最新的 1.X 集成的配方将与 Conan 2 兼容,并且两个版本的二进制文件不会冲突,并能够存在于同一服务器存储库中。

Conan 2 迁移指南

如果您正在使用 Conan 1.X,请阅读Conan 2 迁移指南,开始准备您的 2.0 版本软件包配方,并了解一些您仍然在 Conan 1.X 中工作时发生的变化。该指南总结了上述反向移植,以使升级更容易。

新的图模型

Conan 2 定义了新的需求特性(头文件、库、构建、运行、测试、package_id_mode、选项、传递头文件、传递库)和包类型(静态、共享、应用程序、仅头文件),以更好地表示 C 和 C++ 二进制文件(如可执行文件或链接静态库或共享库的共享库)之间发生的关系。

新的公共 Python API

提供了一个新的模块化 Python API,它是公开的并且有文档记录。这是一个真正的 API,具有已经用于构建 Conan 内置命令的构建块,但它将允许进一步的扩展。有针对不同功能组的子 API,如api.listapi.searchapi.removeapi.profileapi.graphapi.uploadapi.remotes 等,它们将允许实现高级用户流程、功能和自动化。

另请参阅

新的构建系统集成

在最新的 Conan 1.X 中引入,Conan 2 将使用现代构建系统集成,如 CMakeDepsCMakeToolchain,它们是完全透明的 CMake 集成(即,使用的 CMakeLists.txt 根本不需要知道 Conan)。这些集成还可以实现更好的 IDE 集成,例如通过 CMakePresets.json。

另请参阅

新的自定义用户命令

Conan 2 允许使用自定义用户命令扩展 Conan,这些命令用 Python 编写,可以作为 conan xxxx 调用。这些命令可以与 conan config install 共享和安装,并且具有命令和子命令层。自定义用户命令使用新的 2.0 公共 Python API 来实现其功能。

新的 CLI

Conan 2 重新设计了 CLI,以获得更好的一致性,消除歧义并改善用户体验。新的 CLI 还会将所有信息、警告和错误消息发送到 stderr,同时将最终结果保留在 stdout 中,允许使用多种输出格式,如 --format=html--format=json,并使用重定向来创建文件 --format=json > myfile.json。CLI 提供的信息将更加结构化和彻底,以便可以更轻松地用于自动化,尤其是在 CI/CD 系统中。

另请参阅

新的部署器

Conan 2 实现了“部署器”,可以在命令行中作为 conan install …. --deployer=mydeploy 调用,通常用于执行从 Conan 缓存到用户文件夹的复制操作。此类部署器可以是内置的(目前提供了“full_deploy”、“direct_deploy”和“runtime_deploy”),也可以是用户定义的,可以使用 conan config install 共享和管理。部署器在生成器之前运行,并且它们可以更改目标文件夹。例如,如果 --deployer=full_deploy 部署器在 CMakeDeps 之前运行,则 CMakeDeps 生成的文件将指向 full_deploy 部署器在用户文件夹中进行的本地副本,而不是 Conan 缓存。

部署器可以是多配置的。为不同的配置文件重复运行 conan install . --deployer=full_deploy,可以实现一个完全独立的自包含项目,包括所有工件、二进制文件和构建文件,该项目完全独立于 Conan,并且不再需要 Conan 进行构建。

新的 package_id

Conan 2 定义了一个新的、动态的 package_id,这是对 Conan 1.X 的限制的重大改进。这个 package_id 将考虑包类型和需求类型,以根据场景实现更有意义的策略。例如,众所周知,当应用程序 myapp 链接静态库 mylib 时,静态库 mylib 的二进制文件的任何更改都需要重新构建应用程序 myapp。因此,Conan 将默认为 full_mode 之类的模式,该模式将为 mylib 配方或二进制文件的每次更改生成新的 myapp package_id。虽然静态库 mylib_amylib_b 使用之间的依赖关系通常并不意味着 mylib_b 的更改总是需要重建 mylib_a,并且该关系可以默认为 minor_mode 模式。在 Conan 2 中,修改 mylib_a 的人可以更好地表达消费者 mylib_b 是否需要重建,这取决于版本号的提升(补丁版本号的提升不会触发重建,而次要版本号的提升会触发重建)

此外,Conan 中的默认版本控制方案已推广到任意数量的数字和字母,而不是仅使用 3 个字段的官方“semver”。

compatibility.py

Conan 2 具有一种新的扩展机制,可在全局级别定义二进制兼容性。Conan 缓存中的 compatibility.py 文件将用于定义在给定包缺少某些二进制文件时应使用哪些二进制文件的回退。Conan 将提供一个默认文件来考虑 cppstd 兼容性和可执行文件兼容性,但是此扩展由用户完全可配置(并且也可以使用 conan config install 共享和管理)

新的锁定文件

Conan 2 中的锁定文件已大大简化,并且更加灵活。现在,锁定文件被建模为排序的引用列表,这允许单个锁定文件用于多个配置、合并锁定文件、应用部分定义的锁定文件、严格或非严格、向锁定文件添加用户定义的约束等等。

新的配置和环境管理

名为 [conf] 的新配置系统(在配置文件和命令行中,并在 Conan 1.X 中进行实验性引入)现在是配置和控制 Conan 行为的主要机制。这个想法是,配置系统用于将信息从 Conan(Conan 配置文件)传输到 Conan(Conan 配方或像 CMakeToolchain 这样的 Conan 构建系统集成)。这种新的配置系统可以定义字符串、布尔值、列表,比使用环境变量更清晰、结构化和强大。在 Conan 1.X 中也引入了更好、更明确的环境管理,现在是将信息从 Conan(配置文件)传递到工具(如编译器、构建系统)的方式。

另请参阅

多版本缓存

Conan 缓存已完全重新设计,允许一次存储多个修订版本。它还缩短了路径,使用了哈希值,从而无需在 Windows 中使用 short_paths。请注意,缓存仍然不是并发的,因此并行作业或任务应使用独立的缓存。

新的扩展插件

添加了多个名为“插件”的扩展点,为 Conan 配方实现的功能提供高级且通常是正交的功能。这些插件可以通过 conan config install 进行共享、管理和安装。

配置文件检查器

提供了一个新的 profile.py 扩展点,可用于在处理配置文件后对其执行操作。提供了一个默认实现,用于检查给定的编译器版本是否能够支持给定的编译器 cppstd,但用户可以完全自定义此实现。

命令包装器

一个新的 cmd_wrapper.py 扩展提供了一种将任何 conanfile.py 命令(即在配方中 self.run() 内运行的任何内容)包装在新命令中的方法。此功能对于将构建命令包装到诸如 IncrediBuild 或编译缓存等构建优化工具中非常有用。

软件包签名

添加了一个新的 sign.py 扩展,用于实现软件包的签名和验证。随着人们对软件供应链安全重要性的认识不断提高,能够对软件包进行签名和验证的能力变得越来越重要。此扩展点很快将获得一个基于 Sigstore 的插件实现。

软件包不可变性优化

在 Conan 2 中,彻底使用 revisions(在 Conan 1.X 中已经作为可选择加入的功能引入,请参阅 https://docs.conan.org.cn/en/latest/versioning/revisions.html),以及声明工件的 不可变性,可以改进流程、下载、安装和更新依赖项以及上传依赖项。

revisions 可以实现对工件的准确追溯,从而可以更好地更新流程。例如,只要它们是从相同的配方修订版本创建的,就可以更容易地从不同的存储库获取针对不同配置的不同二进制文件。

基于 revisions,软件包的传输、上传和下载也将更加高效。只要服务器上或缓存中存在给定的修订版本,Conan 就不会传输该软件包的任何工件。

软件包列表

Conan 2 允许使用“软件包列表”功能对多个配方和软件包执行批量操作。此功能允许使用单个命令上传、下载、删除和列出多个配方和软件包。

软件包列表也可以从 conan createconan install 命令生成的依赖关系图中创建,因此只需链接 2 个命令,即可将属于给定依赖关系图的所有软件包上传到服务器。

元数据文件

Conan 2 允许存储、上传、下载和修改与配方和软件包关联的元数据文件。此功能对于管理构建日志、测试可执行文件、测试结果、覆盖率数据以及许多其他用于可追溯性、合规性和业务目的的不同文件非常有用。

第三方备份源

在为 Internet 上有源代码的第三方构建软件包时,这些源代码可能会被删除或更改。“备份源”可以自动在您自己的服务器上存储这些源代码的副本,因此无论原始 Internet 源发生什么情况,您的构建始终是完全可重现的。

另请参阅

从 Conan 软件包安装配置

从 Conan 2.2 开始,不仅可以从 git 存储库和 http 服务器安装配置,还可以从 Conan 软件包安装配置。在 Conan 服务器上存储的 Conan 软件包 myconf/myversion 上执行 conan config install-pkg myconf/myversion,允许安装该软件包内的配置文件。它还允许使用版本范围轻松更新到该范围内的最新版本,并使用锁定文件来实现可重现性。