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 定义了新的需求特征(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 等,这些 API 将允许实现高级用户流程、功能和自动化。

另请参阅

新的构建系统集成

Conan 2 引入了最新的 Conan 1.X 中的现代构建系统集成,例如 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 实现了“部署器”,可以通过命令行调用,例如 conan install …. --deployer=mydeploy,通常用于从 Conan 缓存将文件复制到用户文件夹。这些部署器可以是内置的(目前提供了“full_deploy”、“direct_deploy”和“runtime_deploy”),也可以是用户定义的,可以通过 conan config install 进行共享和管理。部署器在生成器之前运行,它们可以更改目标文件夹。例如,如果 --deployer=full_deploy 部署器在 CMakeDeps 之前运行,那么 CMakeDeps 生成的文件将指向用户文件夹中的本地副本,而不是 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 中的默认版本方案已推广到任何数量的数字和字母,而不是官方的“semver”,后者仅使用 3 个字段。

compatibility.py

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

新的锁定文件

Conan 2 中的锁定文件已大大简化并变得更加灵活。锁定文件现在被建模为排序引用的列表,这允许使用单个锁定文件进行多个配置,合并锁定文件,应用部分定义的锁定文件,严格或非严格模式,向锁定文件添加用户定义的约束,以及更多功能。

新的配置和环境管理

新的配置系统,在配置文件和命令行中称为 [conf],并在 Conan 1.X 中实验性引入,现在是配置和控制 Conan 行为的主要机制。其理念是使用配置系统将信息从 Conan(Conan 配置文件)传递到 Conan(Conan 配方或 Conan 构建系统集成,如 CMakeToolchain)。这个新的配置系统可以定义字符串、布尔值、列表,并且比环境变量更简洁、结构化和强大。更好的、更明确的环境管理(也在 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/2/versioning/revisions.html),以及声明工件的**不变性**,可以改进下载、安装、更新和上传依赖项的过程。

Revisions 允许对工件进行精确的追溯,从而可以改进更新流程。例如,从不同仓库获取不同配置的二进制文件将更容易,只要它们是从相同的配方修订版本创建的。

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

包列表

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

包列表也可以从 conan createconan install 命令产生的依赖图生成,因此可以通过链接两个命令将给定依赖图中的所有包上传到服务器。

元数据文件

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

第三方备份源

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

从 Conan 包安装配置

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