Conan 2 有何新特性

Conan 2 带来了许多令人兴奋的改进,这些改进基于过去几年使用 Conan 1.X 学到的经验。此外,为了简化升级,我们付出了大量努力将必要的功能回移植到 Conan 1.X:使用最新 1.X 集成的 recipe 将与 Conan 2 兼容,并且两个版本的二进制文件不会冲突,可以在同一服务器仓库中共存。

Conan 2 迁移指南

如果您正在使用 Conan 1.X,请阅读Conan 2 迁移指南,开始为 2.0 准备您的包配置脚本,并在使用 Conan 1.X 时了解一些更改。该指南总结了上述回移植内容,以简化升级。

新图模型

Conan 2 定义了新的依赖特性(headers, libs, build, run, test, package_id_mode, options, transitive_headers, transitive_libs)和包类型(static, shared, application, header-only),以更好地表示 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 允许使用 Python 编写自定义用户命令来扩展 Conan,这些命令可以像 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 实现了“部署器(deployers)”,可以在命令行上调用,例如 conan install …. --deployer=mydeploy,通常用于将 Conan 缓存中的文件复制到用户文件夹。此类部署器可以是内置的(目前提供了“full_deploy”、“direct_deploy”和“runtime_deploy”),也可以是用户自定义的,后者可以通过 conan config install 共享和管理。部署器在生成器之前运行,它们可以更改目标文件夹。例如,如果 --deployer=full_deploy 部署器在 CMakeDeps 之前运行,那么 CMakeDeps 生成的文件将指向 full_deploy 部署器在用户文件夹中完成的本地副本,而不是 Conan 缓存。

部署器可以是多配置的。针对不同的 profile 重复运行 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 的人可以根据版本升级(patch 版本升级不会触发重新构建,而 minor 版本升级会触发)更好地表达使用者 mylib_b 是否需要重新构建。

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

compatibility.py

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

新 lockfile

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

新配置和环境管理

新的配置系统在 profile 文件和命令行中称为 [conf],并在 Conan 1.X 中作为实验性功能引入,现在是配置和控制 Conan 行为的主要机制。其理念是配置系统用于将信息从 Conan(一个 Conan profile)传递给 Conan(一个 Conan recipe,或一个 Conan 构建系统集成,如 CMakeToolchain)。这个新的配置系统可以定义字符串、布尔值、列表,并且比环境变量更清晰、更结构化和强大。一个更好、更显式的环境管理,也在 Conan 1.X 中引入,现在是将信息从 Conan(profile 文件)传递给工具(如编译器、构建系统)的方式。

另请参阅

多修订版本缓存

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

新扩展插件

新增了几个扩展点,称为“插件(plugins)”,用于提供 Conan recipe 实现之外的高级且通常正交的功能。这些插件可以通过 conan config install 共享、管理和安装。

Profile 检查器

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

命令包装器

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

包签名

新增了 sign.py 扩展来实现包的签名和验证。随着人们对软件供应链安全重要性认识的提高,签名和验证软件包的能力变得越来越关键。这个扩展点很快就会有一个基于 Sigstore 的插件实现。

包不变性优化

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

Revisions 允许准确追踪制品,从而实现更好的更新流程。例如,更容易从不同的仓库获取不同配置的不同二进制文件,只要它们是基于相同的 recipe 修订版本创建的。

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

包列表

Conan 2 允许通过“包列表(Package Lists)”功能对多个 recipe 和包执行批量操作。此功能允许使用单个命令上传、下载、移除和列出多个 recipe 和包。

包列表也可以从 conan createconan install 命令产生的依赖图创建,因此只需串联两个命令,就可以将属于给定依赖图的所有包上传到服务器。

元数据文件

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

第三方备份源

为第三方构建来自互联网源的包时,这些源可能会被删除或更改。“备份源”可以自动将这些源的副本存储到您自己的服务器上,这样无论原始互联网源发生什么,您的构建总是完全可重现的。

从 Conan 包安装配置

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