快速了解最新的 Conan 功能
大家好!我是 Chris,一些朋友可能已经在 GitHub 上认识我了,我的用户名是 prince-chrismc,我最近加入了 Conan 担任开发者布道师。我之前的工作主要是物联网和区块链技术的桌面/Web 应用程序……可以说 C++ 相关的经验不多。我的首要任务就是学习 Conan 2.0 中的所有新功能,这些功能将彻底改变游戏规则。
Conan 2.0 将很快发布,因此务必使用最新功能更新您的配方。旧方法已弃用,并将被移除。请务必查看 Conan 2.0 配方迁移 获取详细信息。
Conan 2.0 Beta 版于 2022 年 6 月 20 日发布,我花了两个星期的时间,在 Conan 团队和 Slack 社区的帮助下,将我的一个项目从 1.33 升级到 1.51。升级我的项目只需要 大约 125 行差异,其中一半来自更新我的 readme.md
文件。以下是我学到的一些重要内容。
简而言之 - 最大的变化是切换到新的生成器。Conan 与构建系统交互的方式以及可能需要迁移的工作流程都会受到影响。不要害怕,这实际上比听起来要容易得多。
为什么生成器要发生变化?
6 年前 Conan 1.0 发布时,C++ 的格局与现在不同,开发者对包管理器的需求也显著增长。构建系统的改进增强了 Conan 无缝融入常规工作流程的能力。
具体来说,对于 CMake,使用工具链可以准确声明设置和配置文件。这使得构建更加确定性。最值得注意的是,这使得集成完全透明。在 CMake 3 中,我们获得了 find_package
和 IMPORTED
目标。在随后的几年里,这已成为使用外部库的主要且推荐的方式。
在了解 2.0 的过程中,“透明”一直是热门词汇。如果您编写了良好的构建脚本,那么将 Conan 添加到您的项目中将不需要任何更改。升级应该只是删除 Conan 特定的项目。
生成器更改
最初,Conan 提供了 cmake
生成器,您需要修改您的 CMakeLists.txt
以获取正确的设置。随着行业范围内对目标的采用,Conan 引入了 cmake_find_package[_multi]
并逐渐提高了灵活性。
现在,您应该用 CMakeToolchain
和 CMakeDeps
替换它们。您不再需要修改 CMakeLists 以包含 conanbuildinfo.cmake
,只需在配置 CMake 时传递 conan_toolchain.cmake
即可。目标仍然会生成,但在几乎所有情况下,它们现在都带有正确的命名空间和目标名称(如果不是,请向 ConanCenter 提交 PR)。
最大的缺点是您需要在 cmake ..
之前调用 conan install
。乍一看这似乎没什么问题,但如果您依赖于支持 cmake 的第三方工具,那么您将不再有 cmake-wrapper
来为您调用 Conan。CMake 设计工具链支持的方式是在声明项目之前,需要在配置阶段预先设置。
Conan 将不再从 CMake 获取其设置,而是将 Conan 的设置转换为 CMake,您需要显式传递这些设置。
布局
布局是一个巨大的改进。以前,您需要两个不同的工作流程,一个用于本地开发,另一个用于创建包。调试后者是一场噩梦,并且经常会出现结构性变化,需要使用令人讨厌的解决方法。通过新的生成器了解布局,它们可以在缓存中保留项目的构建结构,以便在两者中都使用相同的相对结构。这也应该有助于 editable
模式,该模式看起来很有希望。我非常期待再次尝试它。
预设
CMake 预设非常棒。在 Conan 在我的构建目录中创建一些文件之前,我从未知道它们的存在。Conan 2.0 将 CMake 的要求提升到 3.15,但我建议您在本地开发中使用 3.23+ 以充分利用 1.x 提供的功能。
在配置 CMake 时,您不再需要指定编译架构以匹配您的配置文件。Conan 将预填充所有这些信息,CMake 将自动检测并加载它。 cmake .. -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release
现在可以替换为 cmake --preset release
。
值得注意的是,某些编译器(目前)不会被传递,对于 gcc
,如果您将配置文件设置为特定版本 compiler.version=11
,则仍然需要将环境变量传递给 CMake CC=gcc-11 CXX=g++-11
。当编译器版本在 CMake 生成器中时,您不需要这样做。
两个配置文件是新的标准
Conan 一直以来都区分了主机和构建上下文,但将在 2.0 中引入的功能要求您更加明确。您可能会遇到要求您指定构建上下文的提示,我的“通用默认”建议是:
-pr:h
(或-pr
,因为 99% 的情况下您都在更改正在生成的二进制文件的配置)是二进制文件的设置 + 工具的配置(例如CMakeToolchain
使用 Ninja,构建类型设置为 Debug,或切换环境变量以使用不同的编译器)。-pr:b
可以是default
。您的构建机器环境应该使用默认的 Conan 配置文件检测。这是 Conan 2.0 中从None
到default_profile
的更改。如果您需要从源代码编译工具,则需要在此配置文件中设置信息。