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.list、api.search、api.remove、api.profile、api.graph、api.upload、api.remotes 等,这些 API 将允许实现高级用户流程、功能和自动化。
另请参阅
新的构建系统集成¶
在最新的 Conan 1.X 中引入,Conan 2 将使用现代构建系统集成,例如 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)。
新的 lockfiles¶
Conan 2 中的 lockfiles 得到了极大的简化,并且变得更加灵活。 Lockfiles 现在被建模为排序引用的列表,这允许单个 lockfile 用于多个配置,合并 lockfiles,应用部分定义的 lockfiles,严格或非严格,将用户定义的约束添加到 lockfiles,等等。
新的配置和环境管理¶
新的配置系统,称为配置文件中的 [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 create 或 conan install 命令产生的依赖关系图中创建,因此可以通过链接两个命令将属于给定依赖关系图的所有包上传到服务器。
元数据文件¶
Conan 2 允许存储、上传、下载和修改与配方和包关联的元数据文件。 此功能对于管理构建日志、测试可执行文件、测试结果、覆盖率数据以及可追溯性、合规性和业务目的所需的各种其他文件非常有用。
另请参阅
第三方备份源¶
当为互联网上的第三方构建包时,这些源可能会被删除或更改。 “备份源”可以自动将这些源的副本存储在您自己的服务器上,因此您的构建始终是完全可重现的,无论原始互联网源发生什么情况。
另请参阅
从 Conan 包安装配置¶
从 Conan 2.2 开始,可以从 git 仓库和 http 服务器以及 Conan 包安装配置。 运行 conan config install-pkg myconf/myversion 以获取存储在 Conan 服务器上的 Conan 包 myconf/myversion,将安装该包内的配置文件。 它还允许使用版本范围轻松更新到范围内的最新版本,并使用 lockfiles 实现可重现性。