Conan 1.38 现已发布,并带来了许多新功能和一些错误修复。正如我们在之前的文章中所解释的那样,我们正在为 Conan 2.0 铺平道路,因此大多数新功能都与此相关。我们添加了一个新的 conanfile.dependencies 模型,使用字典返回有关依赖项的信息,并且可以直接在配方中使用,也可以间接用于创建自定义构建集成和生成器。此外,Conan 配置文件现在支持 jinja2 语法,这提供了读取环境变量、使用平台信息等等的能力。我们添加了一个新的 cmake_layout() 布局助手来定义一个多平台 CMake 布局,它适用于不同的生成器(Ninja、Xcode、Visual Studio、Unix),并且是多配置的。还有一个新的 --conf 参数,用于为新的 conf 系统提供命令行支持。最后,我们添加了一个新的 PkgConfigDeps 生成器,它将在 Conan 2.0 中取代现有的 pkg_config 生成器。

新的 conanfile.dependencies 模型

从 1.38 开始,Conan 配方将通过 self.dependencies 属性访问其依赖项。主要用途是创建新的构建系统集成,并且已经被 Conan 生成器(如 CMakeDepsMSBuildDeps)广泛用于生成构建所需的必要文件。也可以像这样从配方中访问 conanfile.dependencies

class MypkgConan(ConanFile):
    name = "mypkg"
    version = "1.0"
    requires = "libwebsockets/4.2.0"

    def generate(self):
        libwebsockets = self.dependencies["libwebsockets"]
        self.output.info(f"{libwebsockets.ref.version}")
        self.output.info(f"{libwebsockets.ref.revision}")
        self.output.info(f"{libwebsockets.settings.arch}")
        self.output.info(f"{', '.join([dep.ref.name for dep in libwebsockets.dependencies.values()])}")

如您所见,我们可以获取有关 Conan 引用、设置,甚至特定依赖项的依赖项信息。请注意,此信息是**只读**的,并且只能在计算完整依赖项图之后调用的方法中使用。有关此内容的更多详细信息,请查看文档

此新模型还允许以类似字典的方式迭代配方的依赖项,该字典的键将包含当前配方与依赖项之间关系的说明符。目前,它可以告诉我们依赖项是否是直接需求(通过 direct 属性)或者是否是build_require(由 build 属性返回)。基于这些值,有一些辅助属性可以迭代所有依赖项并过滤我们想要的依赖项。例如,如果要列出依赖项的所有“主机”需求,可以调用 self.dependencies.host 并获取所有不是build_require的直接和传递需求。

class MypkgConan(ConanFile):
    name = "mypkg"
    version = "1.0"
    requires = "libwebsockets/4.2.0"

    def generate(self):
        trans_deps = self.dependencies.host
        self.output.info(f"transitive deps: {', '.join([dep.ref.name for dep in trans_deps.values()])}")

输出将如下所示

mypkg/1.0: Calling generate()
mypkg/1.0: transitive deps: libwebsockets, openssl

有关可用的辅助属性的更多详细信息,请参阅Conan 文档

在 Conan 配置文件中支持 jinja2 语法

在许多用户请求拥有更强大的配置文件后,我们尝试了不同的实现,并最终决定实验性地提供 Conan 配置文件以支持 jinja2 模板语法。这为 Conan 配置文件提供了一些非常有用的功能。唯一需要做的事情是用 .jinja 扩展名命名配置文件。让我们看看其中的一些功能

  • 在配置文件中使用环境变量。Python os 模块已添加到渲染上下文中,因此我们可以使用纯 Python 语法读取环境变量。此外,您可以定义变量以供以后使用。

      {% set build_type = os.getenv("MY_BUILD_TYPE") %}
      [settings]
      build_type = {{ build_type }}
    
  • 访问平台信息。Python platform 模块也已添加到渲染上下文中,以便我们可以根据运行 Conan 的操作系统设置设置。

      [settings]
      os = {{ {"Darwin": "Macos"}.get(platform.system(), platform.system()) }}
    
  • 使用变量 profile_dir 访问当前配置文件目录。

您可以在Conan 文档中找到与此功能相关的所有信息。

新的 cmake_layout() 布局助手

1.37 中为 conanfile.py 发布了新的 layout() 方法后,在此版本中,我们添加了一个为 CMake 预定义的布局助手。此布局将检查 CMake 生成器并根据该生成器设置相应的文件夹。例如,对于多配置生成器(如 Visual StudioXcode),文件夹将相同,而不管构建类型如何,并且构建系统将在该文件夹内管理不同的构建类型。但是,对于单配置生成器(如 Unix Makefiles),将为每个不同的配置设置不同的文件夹。

在配方中使用它就像这样

from conan.tools.layout import cmake_layout

def layout(self):
    cmake_layout(self)

您可以在文档中查看此助手的实现。如果您的布局例如在源代码位置不同,则可以覆盖默认值,如下所示

def layout(self):
    cmake_layout(self)
    self.folders.source = "mysrcfolder"

从命令行配置 [conf] 支持

从 Conan 1.38 开始,您还可以使用 -c 参数为某些命令设置新的配置值。以上面描述的 cmake_layout() 为例,使用命令行更改 CMake 生成器非常方便,如下所示

conan create . -c tools.cmake.cmaketoolchain:generator=Xcode

新的 PkgConfigDeps 生成器

另请查看新的 PkgConfigDeps 生成器,旨在在 Conan 2.0 中替换我们的“经典” pkg_config 生成器。它使用了我们在本文开头讨论过的新的 conanfile.dependencies 模型。有关如何使用它的更多信息,请查看文档



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

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