Conan 2.0 食谱迁移至 ConanCenterIndex
- 您需要的一切都在 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
公开的。您还需要更改文件方法的源和目标,新的静态方法不再假设文件夹,并要求您明确指定。
仅通过更改导入,您就可以看到新旧版本之间的区别。
您可能会注意到唯一被删除的导入是 functools
,这是因为新的生成器和构建辅助程序……我们很快就会讲到它们。
启用布局
2.0 中的关键特性之一是启用了许多改进,即 布局。由于 RESTinio 是一个基于 CMake 的项目,您可能会使用 cmake_layout
,但是这是针对构建和打包库量身定制的。这可能有效,但这是一种“少即是多”的情况……对于仅限头文件的项目,我建议从 basic_layout
开始。
导入并添加它之后,我们终于可以替换一些混乱的部分,即 ConanCenterIndex 中的那些旧的“子文件夹属性”。
\_source_subfolder
变为source_folder
\_build_subfolder
可以替换为self.build_folder
我们可以进行更多清理。由于这是仅限头文件的项目,因此没有“构建文件夹”,但我们确实配置了 CMake。这现在由新的 conan.tools.cmake.CMake
构建辅助程序处理。由于 basic_layout
设置了属性 self.build_folder
,因此 CMake 辅助程序充分利用了这一点。
切换到新的生成器
此食谱以前使用旧的 cmake
生成器作为属性……它应该使用 cmake_find_package_multi
,但让我们假装它确实使用了。这些可以分别替换为 CMakeToolchain
和 CMakeDeps
。
此更改产生了很大差异。
-
我们不再将 CMake 配置选项传递给构建辅助程序。
- 该责任已交由新的工具链承担。
- CMakeDeps 将生成 RESTinio 调用
find_package
所需的文件。
-
cmake.definitions
可以替换为tc.variables
最棒的是清理!我们还可以删除旧的生成器属性以及我们过去用于调用旧的 cmake
生成器 include(conanbuildinfo.cmake)
和 conan_basic_setup()
的旧“cmake 包装器”。
遗憾的是,在这里我们发现了第一个警告……我们在 ConanCenterIdex 中使用的此“cmake 包装器”有时会隐藏功能。在此特定示例中,它使用其 CMakeLists.txt
将构建辅助程序引导至 RESTinio 的正确子文件夹。使用 add_subdirectory(source_subfolder/dev/restinio)
,因此我们需要将其移动到食谱中。
值得庆幸的是,这是一个非常常见的情况,新的构建辅助程序可以正确配置。
我们可以简单地传递 build_script_folder
参数来让它知道将用于配置 CMake 的“源文件夹”。
处理 validate 方法
这是最复杂的部分。在 Conan 2.0 中,我们将删除用于 msvc
编译器的 Visual Studio
编译器。有很多原因,所以您可能需要查看 Conan 部落提案,其中决定了这一点。
值得庆幸的是,我们不需要过多考虑这一点,因为社区已经找到了解决此问题的最佳方法。查看 ConanCenterIndex 中的 CMake 模板包,我们可以看到有一个新的辅助程序 check_min_vs
处理新的编译器。
有一些值得注意的 Conan 2.0 更改
self.settings.compiler
变为self.info.settings.compiler
- 这实际上是我们在 ConanCenterIndex 中看到的迁移痛点,存在一些权衡。
check_min_vs
已添加
此外,我们不再打印警告,这是因为 ConanCenter 中的约定导致大量用户(包括使用自定义编译器或使用自定义设置定义编译器)产生很多噪音。
更新包 ID
这非常简单,通常是最后一步。旧的 header_only
已替换为 clear
,以便更清楚地说明其作用。
包信息和 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
中删除到旧生成器的行
- 更改复制的文件
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 感兴趣,这是最终产品,并且已合并!