我们很高兴地宣布 Conan 1.50 已经发布,它带来了一些重要的新功能和错误修复。我们添加了 CMakeToolchain.cache_variables 以便通过构建助手中的 -D 参数应用它们。此外,我们改进了组件的 XCodeDeps 支持。最后,我们继续修复问题并移植工具,以便配方语法与 Conan 2.0 兼容。

新的 CMakeToolchain.cache_variables

从这个版本开始,CMakeToolchain 生成器 提供了一个属性来定义 CMake 缓存变量。这些变量将存储在 CMakePresets.json 文件中(位于 configurePreset 中的 cacheVariables 中),并在使用 Conan CMake 构建助手 调用 cmake.configure 时使用 -D 参数应用。让我们看一个例子

...
class MylibConan(ConanFile):
    ...
    def generate(self):
        tc = CMakeToolchain(self)
        tc.cache_variables["foo"] = True
        tc.cache_variables["foo2"] = False
        tc.cache_variables["var"] = "23"
        tc.generate()

    def build(self):
        cmake = CMake(self)
        cmake.configure()
        cmake.build()

当调用 cmake.configure() 时,它将以下参数传递给 CMake

cmake -G ... -DCMAKE_TOOLCHAIN_FILE="/pathto/conan_toolchain.cmake" ... -Dfoo="ON" -Dfoo2="OFF" -Dvar="23" ...

如您所见,配方中的布尔值会自动转换为 CMake 中的 ONOFF 值。

XCodeDeps 的改进

自从我们在 Conan 1.42 中引入 XcodeDeps 以来,我们一直在逐步改进此生成器。从 Conan 1.49 开始,此生成器为具有组件的包创建单独的 .xcconfig 文件,现在此版本添加了一些内部优化,使其更有效地使用此类包。组件支持使得可以选择特定的组件而不是添加整个包。例如,如果您直接依赖于一个具有组件的包,例如 boost,但您只想使用 boost filesystemchrono 组件,您可以在配方的 generate() 方法中轻松做到这一点。让我们看一个例子

import textwrap
from conan import ConanFile
from conan.tools.apple import XcodeDeps
from conan.tools.files import save


class MyappConan(ConanFile):
    name = "myapp"
    version = "1.0"

    ...
    
    def generate(self):
        deps = XcodeDeps(self)
        deps.generate()
        # overwrite the generated conandeps.xcconfig
        # with just the components
        # we want to use instead the whole package
        component_deps = textwrap.dedent("""
            #include "conan_boost_filesystem.xcconfig"
            #include "conan_boost_chrono.xcconfig"
            """)
        save(self, "conandeps.xcconfig", component_deps)

提供 2.0 兼容配方语法的进展

我们继续改进与 Conan 2.0 的语法兼容性,一些相关的更改包括:

有关如何迁移您的配方以使其与 Conan 2.0 兼容的更详细信息,请查看 迁移指南

Conan 2.0 文档的进展

我们想谈谈 Conan 2.0。如您所知,第一个 Conan 2.0 beta 版已经发布。您可以使用 pip 安装它

$ pip install conan --pre

我们最近努力完成了 新版 Conan 的文档。虽然 2.0 的文档仍处于“草稿”状态,但某些部分实际上已经完成。Conan 1.X 和 Conan 2.0 文档的结构有一些差异。让我们看看 Conan 2.0 文档中最相关的部分

教程部分

这个 新部分 对 Conan 最重要的功能进行了实用的动手介绍。目的是逐步学习这些功能。本节分为三个子部分

  • 使用包:这部分已经完成,展示了如何使用 Conan 来管理依赖项构建您的项目,从一个使用 Zlib 库的简单项目开始。在本节中,您将学习诸如 使用 tool_requires、什么是 Conan 设置和选项、如何使用 conanfile.py 使用,以及如何使用双配置文件方法 交叉编译 您的应用程序。

  • 创建包:本节已完成一半,展示了如何使用 Conan 配方创建 Conan 包。我们首先 创建一个基本的 Conan 配方 来打包一个简单的 C++ 库,您可以使用 conan new 命令对其进行脚手架,然后我们开始向其中添加功能,解释 Conan 配方的不同方法是如何工作的。主题包括 如何从外部存储库检索源代码 并应用补丁、自定义工具链、二进制兼容性如何工作以及如何打包 Conan 包的文件。教程的最后一部分是关于不同类型的 Conan 包的特性,如 仅限头文件的包预构建二进制文件的包tool requires 包

  • 版本控制和持续集成:本节尚未编写。我们将在此处提供一些在您的 CI 中使用 Conan 的“最佳实践”。

示例部分

本节收集了一些 Conan 功能的相关用例示例,例如:

参考部分

本节 将收集您可以在 Conan 配方中使用的公共类和方法的参考。参考的一个重要部分是记录 Conan API 的部分。尽管此 API 的开发仍在进行中并且尚未稳定,但我们计划为 Conan 2.0 记录整个 Conan API,以便您可以在项目中使用它。一个相关的示例是 创建 Conan 自定义命令 来清理 Conan 缓存并使用此 API 的一些方法。



除了上面列出的项目外,还有一些您可能希望了解的次要错误修复。如果是这样,请参阅 更改日志 以获取完整列表。

我们希望您喜欢此版本,并期待您的 反馈