Conan 1.38:新的 self.dependencies 模型用于访问依赖项数据,支持在 Conan 配置文件中使用 Jinja2 语法,新的 cmake_layout(),新的 [conf] 命令行支持,新的 PkgConfigDeps 生成器。
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 生成器(如 CMakeDeps
或 MSBuildDeps
)广泛用于生成构建所需的必要文件。也可以像这样从配方中访问 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 Studio 或 Xcode),文件夹将相同,而不管构建类型如何,并且构建系统将在该文件夹内管理不同的构建类型。但是,对于单配置生成器(如 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 模型。有关如何使用它的更多信息,请查看文档。
除了上面列出的内容之外,还有一些小的错误修复,您可能希望了解。如果是这样,请参阅变更日志以获取完整列表。
我们希望您喜欢此版本,并期待您的反馈。