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.list
、api.search
、api.remove
、api.profile
、api.graph
、api.upload
、api.remotes
等,这将允许实现高级用户流、功能和自动化。
另请参阅
新的构建系统集成¶
Conan 2 中引入的最新 Conan 1.X 将使用现代构建系统集成,如 CMakeDeps
和 CMakeToolchain
,它们是完全透明的 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
生成的文件将指向 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_a
与 mylib_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
命令(即,在 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
允许准确地追溯 artifacts,从而可以更好地进行更新流程。 例如,只要它们是从相同的 recipe revision 创建的,就可以更容易地从不同的存储库中获取不同配置的不同二进制文件。
基于 revisions
,包传输、上传和下载也将更加高效。 只要给定的 revision 存在于服务器或缓存中,Conan 将完全不会传输该包的 artifacts。
包列表¶
Conan 2 允许使用“包列表”功能对多个 recipes 和 packages 执行批量操作。 此功能允许使用单个命令上传、下载、删除和列出多个 recipes 和 packages。
包列表也可以从 conan create
或 conan install
命令产生的依赖关系图中创建,因此可以通过链接两个命令将属于给定依赖关系图的所有 packages 上传到服务器。
元数据文件¶
Conan 2 允许存储、上传、下载和修改与 recipes 和 packages 关联的元数据文件。 此功能对于管理构建日志、测试可执行文件、测试结果、覆盖率数据以及用于可追溯性、合规性和业务目的的各种其他文件非常有用。
另请参阅
第三方备份源¶
当为互联网上带有 sources 的第三方构建 packages 时,这些 sources 可能会被删除或更改。 “备份源”可以自动将这些 sources 的副本存储在您自己的服务器上,因此无论原始互联网 sources 发生什么情况,您的构建始终可以完全重现。
另请参阅
从 Conan packages 安装配置¶
从 Conan 2.2 开始,不仅可以从 git 存储库和 http 服务器安装配置,还可以从 Conan packages 安装配置。 对存储在 Conan 服务器上的 Conan package myconf/myversion
运行 conan config install-pkg myconf/myversion
将会将该 package 中的配置文件安装到。 它还允许使用版本范围轻松更新到该范围内的最新版本,并使用 lockfiles 实现可重现性。