• 您需要的一切都在 1.53 中可用,因此您可以提前准备食谱
  • 大多数更改都是“查找并替换”

我想升级我的个人项目,社区在升级食谱方面做了一项了不起的工作。甚至超出了我的预期。(我审查了 ConanCenterIndex 收到的“大多数”PR)。


OpenSSL 和 Boost 缺失,但这些内容过于复杂,不适合放在博客中,所以最后一个是 RESTinio,我将尝试分解升级所需的所有更改,以便您升级自己的食谱。

这是一个仅限头文件的项目,但与大多数项目不同(通常它们只是 copy 文件),它是一个基于 CMake 的项目,因此相对简单并且带有一些额外的特性。我唯一不会介绍的内容(因为它已经完成)是用于新的 CMakeDeps 生成器的 package_info “属性名称”。您可以在 ConanCenter 文档中阅读有关 新的 cpp_info.set_property 模型 的信息。

更新导入

所有 2.0 方法都在 conan 命名空间中……请注意,“s”不再存在,这应该使代码审查成为发现新旧版本的一种简单方法。

有一个 备忘清单,用于列出 ConanCenterIndex 中更多文件 I/O 和常见导入。大多数工具导入现在都分组在一起,conans.tools.Version 可从 conan.tools.scm 获取。

我的建议是查找 tools. 并为每个导入添加新的导入,然后将其替换为空字符串,然后将 self 作为第一个参数添加回来。这将适用于除少数名称更改的情况以外的所有情况。您应该能够在 2.0 参考 文档中非常快速地找到工具类别。

对于那些想知道为什么不在使用工具的地方添加工具类别的人,这是为了遵循 工具导入指南 中的建议,其中较高级别的命名空间被视为私有,并且 **不应使用**。

唯一“意外”的是您需要添加的导入。这是因为某些方法以前是 ConanFile 的方法,例如 self.copy 将变为 copy(self, …),并且这是从 conan.tools.files 公开的。您还需要更改文件方法的源和目标,新的静态方法不再假设文件夹,并要求您明确指定。

仅通过更改导入,您就可以看到新旧版本之间的区别。

diff updating imports

您可能会注意到唯一被删除的导入是 functools,这是因为新的生成器和构建辅助程序……我们很快就会讲到它们。

启用布局

2.0 中的关键特性之一是启用了许多改进,即 布局。由于 RESTinio 是一个基于 CMake 的项目,您可能会使用 cmake_layout,但是这是针对构建和打包库量身定制的。这可能有效,但这是一种“少即是多”的情况……对于仅限头文件的项目,我建议从 basic_layout 开始。

导入并添加它之后,我们终于可以替换一些混乱的部分,即 ConanCenterIndex 中的那些旧的“子文件夹属性”。

diff adding layout

  • \_source_subfolder 变为 source_folder
  • \_build_subfolder 可以替换为 self.build_folder

diff removing subfolder properties

我们可以进行更多清理。由于这是仅限头文件的项目,因此没有“构建文件夹”,但我们确实配置了 CMake。这现在由新的 conan.tools.cmake.CMake 构建辅助程序处理。由于 basic_layout 设置了属性 self.build_folder,因此 CMake 辅助程序充分利用了这一点。

adding basic layout

切换到新的生成器

此食谱以前使用旧的 cmake 生成器作为属性……它应该使用 cmake_find_package_multi,但让我们假装它确实使用了。这些可以分别替换为 CMakeToolchainCMakeDeps

此更改产生了很大差异。

diff new generator vs old helper

  • 我们不再将 CMake 配置选项传递给构建辅助程序。

    • 该责任已交由新的工具链承担。
    • CMakeDeps 将生成 RESTinio 调用 find_package 所需的文件。
  • cmake.definitions 可以替换为 tc.variables

最棒的是清理!我们还可以删除旧的生成器属性以及我们过去用于调用旧的 cmake 生成器 include(conanbuildinfo.cmake)conan_basic_setup() 的旧“cmake 包装器”。

diff build method

遗憾的是,在这里我们发现了第一个警告……我们在 ConanCenterIdex 中使用的此“cmake 包装器”有时会隐藏功能。在此特定示例中,它使用其 CMakeLists.txt 将构建辅助程序引导至 RESTinio 的正确子文件夹。使用 add_subdirectory(source_subfolder/dev/restinio),因此我们需要将其移动到食谱中。

值得庆幸的是,这是一个非常常见的情况,新的构建辅助程序可以正确配置。

diff build methods pt2

我们可以简单地传递 build_script_folder 参数来让它知道将用于配置 CMake 的“源文件夹”。

处理 validate 方法

这是最复杂的部分。在 Conan 2.0 中,我们将删除用于 msvc 编译器的 Visual Studio 编译器。有很多原因,所以您可能需要查看 Conan 部落提案,其中决定了这一点。

值得庆幸的是,我们不需要过多考虑这一点,因为社区已经找到了解决此问题的最佳方法。查看 ConanCenterIndex 中的 CMake 模板包,我们可以看到有一个新的辅助程序 check_min_vs 处理新的编译器。

diff validate mthod

有一些值得注意的 Conan 2.0 更改

  • self.settings.compiler 变为 self.info.settings.compiler
    • 这实际上是我们在 ConanCenterIndex 中看到的迁移痛点,存在一些权衡。
  • check_min_vs 已添加

此外,我们不再打印警告,这是因为 ConanCenter 中的约定导致大量用户(包括使用自定义编译器或使用自定义设置定义编译器)产生很多噪音。

更新包 ID

这非常简单,通常是最后一步。旧的 header_only 已替换为 clear,以便更清楚地说明其作用。

diff package id

包信息和 cpp 文件夹

我们将再次需要添加几行代码来帮助优化新的生成器。

布局为我们做了很多工作,包括帮助使用二进制文件、框架和库的文件夹设置 cpp_info。由于我们正在打包仅限头文件的项目,因此需要将其显式设置为空。

测试包

这是食谱的重要组成部分,因为我们仍然希望支持 1.x 版本,同时添加 2.0 版本的支持。这里有很多步骤,但非常简单。

  • 创建一个新文件夹 test_v1_package
  • test_package/conanfile.py 移动到 test_v1_package
  • test_package/CMakeLists.txt 复制到 test_v1_package
  • 在原始的 test_package/CMakeLists.txt 中删除到旧生成器的行

diff old test package cmake list

  • 更改复制的文件 test_v1_package/CMakeLists.txt 以从原始位置 ../test_package/test_package.cpp 拉取源文件,避免重复文件
  • ConanCenterIndex 模板 下载新的 test_package/conanfile.py

这样就完成了。

如果您正在寻找完整的差异,您会对 https://github.com/conan-io/conan-center-index/pull/13338 感兴趣,这是最终产品,并且已合并!