Conan 1.25 在上一个版本的基础上,继续推进新的跨构建模型的相关工作。同时,还带来了一些令人兴奋的全新功能。Conan 通过启用调度 conan config install 命令的能力,学会了自动更新其配置和配置文件。当传递 --table 标志时,我们还显著改进了 conan search 的输出。我们增加了对 GCC 9.3、GCC 10 和 Intel 9.1 编译器的支持,以及大量错误修复。

跨构建建模 + 上下文建模

在上一个版本中,我们引入了新的 “上下文” 抽象以及围绕它们的一些核心功能。但是,实现仍然不够完整,需要此功能的配方需要重构以使用新模型。在此版本中,我们填补了空白,以便配方现在可以开始利用新模型。
1.25 在 conanfile 类中提供了两个可在配方中访问和评估的附加变量

  • settings_build
  • settings_target

这些变量除了现有的 settings 变量之外,该变量仍然存在。文档详细介绍了这些变量何时存在以及它们之间有何不同。概括地说,settings 将在 host 上下文中构建配方的过程中代表 host 设置。否则,它将代表 build 上下文。此外,在跨构建情况下,您在一个上下文中并需要访问另一个上下文的 settings 并不罕见。对于这些情况,settings_buildsettings_target 能够在任何情况下访问这两个上下文。

以下图形有助于说明这些变量及其在不同上下文中的值

context example diagram

附加包组件建模

在此版本中,我们在为包中的“组件”提供稳健建模的旅程中又迈出了一大步。建模是在 package_info() 方法期间的 cpp_info 对象中声明的。

CMake 构建系统是此新抽象的主要驱动力。Conan 有许多生成器,它们不断尝试以这样一种方式将信息馈送到 CMake,即现有的 CMake 文件和用户环境无需更改。这非常困难,原因之一是 CMake 独有的 Target::Component 概念。另一个原因是命名约定不匹配。开源库的 CMake 目标通常具有简单的名称(例如 OpenSSL),而 Conan 生成器会生成带有 CONAN_PKG 前缀的目标以避免冲突(例如 CONAN_PKG::OpenSSL)。

事实证明,在许多情况下,冲突是理想的,以便为现有的 CMakeLists.txt 实现透明集成。

因此,使用 Conan 1.25,开源库的 Conan 包可以重构为使用其众所周知的名称生成其目标,并且可以进一步使用其众所周知的组件定义这些目标。这将在未来几周内进行。同时,我们将重构现有的 CMake 生成器以评估此新的 cpp_info 成员并基于新模型生成文件。这应该是朝着更透明地与现有 CMakeLists.txt 集成的目标迈出的重要一步。

以下是一些演示新核心功能的示例 package_info() 方法

备用目标名称

    def package_info(self):
        self.cpp_info.name = "OpenSSL"

具有两个命名组件的目标

    def package_info(self):
        self.cpp_info.components["crypto"].name = "Crypto"
        self.cpp_info.components["crypto"].defines = ["DEFINE_CRYPTO=1"]
        self.cpp_info.components["crypto"].libs = ["libcrypto"]
        self.cpp_info.components["ssl"].name = "SSL"
        self.cpp_info.components["ssl"].includedirs = ["include/headers_ssl"]
        self.cpp_info.components["ssl"].libs = ["libssl"]

同一包中一个组件到另一个组件的依赖关系

    def package_info(self):
        self.cpp_info.components["crypto"].name = "Crypto"
        self.cpp_info.components["ssl"].name = "SSL"
        self.cpp_info.components["ssl"].requires = ["crypto"]

组件到不同包的依赖关系

    def package_info(self):
        self.cpp_info.components["crypto"].name = "Crypto"
        self.cpp_info.components["crypto"].requires = ["zlib::zlib"] 

组件到不同包中单个组件的依赖关系

    def package_info(self):
        self.cpp_info.components["crypto"].name = "Crypto"
        self.cpp_info.components["crypto"].requires = ["zlib::single_component"] 

此新模型还有更多内容,包括特定于生成器的属性,因此,如果您想了解所有新功能,请参阅文档。

自动配置安装和更新

企业团队的一个常见请求是让开发人员能够以一种不太繁琐的方式将本地机器上的配置文件和设置与配置存储库中维护的最新配置文件和设置保持同步。在 Conan 1.25 中,添加了一个新的 Conan 配置参数

config_install_interval

根据文档,它接受时间段(例如 1m、2h、5d)。配置后,每次运行任何 Conan 命令时,Conan 都会检查上次执行 conan config install 的时间。如果已超过配置的时间间隔,则将再次自动运行 conan config install

可恢复下载

下载文件是 Conan 客户端的常见活动。由于各种原因,下载可能会失败。以前,如果下载失败,它会立即从头开始重新启动。这对任何用户来说都可能令人沮丧,
但对于那些使用非常大的二进制文件的用户来说,此类二进制文件的下载反复失败很容易成为障碍。这种影响会在本地开发工作流程以及 CI 构建中感受到。

在此版本中,Conan 具备了恢复失败下载的功能。由于 Conan 已经具有 重试失败传输的逻辑,因此此新的恢复逻辑将自动启动,并且应该非常有效地缓解网络连接问题带来的任何影响。

新的搜索表格

最后,Conan 在 Conan 搜索命令的新搜索表格输出方面进行了美观升级。这是持续改进围绕 Conan 搜索的整体用户体验的工作的一部分。以下是新表格的预览

New Conan Search HTML Table Output

新的 HTML 表格比以前的版本有了很大的改进。它提供了浏览具有长字段列表的数据表时可能期望的最常见功能。例如……排序和过滤!它还提供可配置的分页和在父列下对子设置的分组。

其他功能和修复

像往常一样,我们无法在本博文中涵盖此版本中的所有内容,因此请访问 更改日志 以获取完整列表。



像往常一样,我们希望您喜欢此版本,并期待您提供 反馈。