MSBuildDeps¶
MSBuildDeps 是 Microsoft MSBuild 构建系统的依赖信息生成器。它将生成多个 xxxx.props 属性文件,每个文件对应一个包的依赖项,供使用 MSBuild 或 Visual Studio 的消费者使用,只需将生成的属性文件添加到解决方案和项目中即可。
在 conanfiles 中,可以使用名称来使用 MSBuildDeps 生成器
class Pkg(ConanFile):
generators = "MSBuildDeps"
[generators]
MSBuildDeps
它也可以在 conanfile 的 generate() 方法中完全实例化
from conan import ConanFile
from conan.tools.microsoft import MSBuildDeps
class Pkg(ConanFile):
settings = "os", "compiler", "arch", "build_type"
requires = "zlib/1.3.1", "bzip2/1.0.8"
def generate(self):
ms = MSBuildDeps(self)
ms.generate()
生成的文件¶
MSBuildDeps 生成器是多配置生成器,它会为任何不同的 Debug/Release 配置生成不同的文件。例如,运行这些命令
$ conan install . # default is Release
$ conan install . -s build_type=Debug
它会生成以下文件
conan_zlib_vars_release_x64.props:
Conanzlibxxxx变量定义,用于zlib依赖项,Release 配置,例如ConanzlibIncludeDirs,ConanzlibLibs等。conan_zlib_vars_debug_x64.props:与
conan_zlib_vars_release_x64.props相同,用于zlib依赖项,Debug 配置。conan_zlib_release_x64.props:在当前构建中激活
Conanzlibxxxx变量,作为标准的 C/C++ 构建配置,Release 配置。此文件还包含传递性依赖项的定义。conan_zlib_debug_x64.props:与
conan_zlib_release_x64.props相同,用于激活Conanzlibxxxx变量,Debug 配置,也包含传递性依赖项。conan_zlib.props:
zlib的属性文件。它会根据配置有条件地包含上面两个 Release/Debug 属性文件中的一个。对于图中的每个依赖项都会生成相同的 5 个文件,在本例中是
conan_bzip.props,它会根据配置有条件地包含 Release/Debug bzip 属性文件。conandeps.props:属性文件,包含所有直接依赖项,在本例中是
conan_zlib.props和conan_bzip2.props
如果希望依赖所有声明的依赖项,请将 conandeps.props 添加到您的解决方案项目文件中。对于单项目解决方案,这可能是最佳选择。对于多项目解决方案,您可能需要为每个项目添加更有效的属性文件。例如,您可以将 conan_zlib.props 属性添加到解决方案中的“project1”,将 conan_bzip2.props 添加到解决方案中的“project2”。
当包没有组件时,会生成上述文件。如果包定义了组件,将生成以下文件
conan_pkgname_compname_vars_release_x64.props:定义包
pkgname的组件compname的变量conan_pkgname_compname_release_x64.props:在 VS 有效变量中激活上述变量,以供构建使用
conan_pkgname_compname.props:包
pkgname的组件compname的属性文件。它会根据配置有条件地包含特定的激活属性文件。conan_pkgname.props:包
pkgname的属性文件。它包含并聚合包的所有组件。conandeps.props:与上面相同,聚合了所有包的直接依赖项的属性文件(例如
conan_pkgname.props)
如果您的项目仅依赖于特定组件,则可以将特定的 conan_pkgname_compname.props 文件添加到项目中,而不是全局的或包的。
需求特性支持¶
上述生成的文件,特别是包含变量的文件(conan_pkgname_vars_release_x64.props/conan_pkgname_compname_vars_release_x64.props),如果需求特性已将其排除,将不包含所有信息。例如,默认情况下,传递性依赖项的 includedirs 将为空,因为除非定义了对该包的特定 requires,否则用户不应包含这些头文件。
配置¶
如果您的 Visual Studio 项目定义了自定义配置,例如 ReleaseShared 或 MyCustomConfig,则可以在 MSBuildDeps 生成器中定义它,以便不同的项目配置可以使用不同的依赖项集。假设我们当前的项目可以构建为共享库,具有自定义配置 ReleaseShared,并且包还通过 shared 选项来控制这一点
from conan import ConanFile
from conan.tools.microsoft import MSBuildDeps
class Pkg(ConanFile):
settings = "os", "compiler", "arch", "build_type"
options = {"shared": [True, False]}
default_options = {"shared": False}
requires = "zlib/1.3.1"
def generate(self):
ms = MSBuildDeps(self)
# We assume that -o *:shared=True is used to install all shared deps too
if self.options.shared:
ms.configuration = str(self.settings.build_type) + "Shared"
ms.generate()
这会为自定义配置生成新的属性文件,并在 IDE 中切换它允许收集依赖项配置,如 Debug/Release,甚至静态和/或共享库。
平台¶
默认情况下,Platform 是根据 Conan arch 设置计算得出的,如下所示
Conan |
MSBuild |
|---|---|
x86 |
Win32 |
x86_64 |
x64 |
armv7 |
ARM |
armv8 |
ARM6 |
如果需要,可以覆盖此默认平台,例如对于希望使用 Platform=x86 而不是 Win32 的 Wix 项目,通过定义 platform 属性
def generate(self):
deps = MSBuildDeps(self)
if self.settings.arch == "x86":
deps.platform = "x86" # Override the "Win32" default value
deps.generate()
依赖项¶
MSBuildDeps 使用 self.dependencies 来访问依赖项信息。以下依赖项将被转换为属性文件
所有直接依赖项,即当前
conanfile声明的依赖项,位于host上下文中:所有常规requires,加上位于 host 上下文的tool_requires,例如测试框架如gtest或catch。所有这些直接依赖项的传递性
requires(都在 host 上下文中)Tool requires,在 build 上下文中,即在构建机器上运行的应用程序和可执行文件,而不管目标平台如何,它们将仅添加到
<ExecutablePath>属性中,其值来自$(Conan{{name}}BinaryDirectories)定义的属性。这允许使用<CustomBuild>和<Command>元素定义自定义构建命令,调用代码生成工具。
自定义¶
conf¶
MSBuildDeps 受这些 [conf] 变量的影响
tools.microsoft.msbuilddeps:exclude_code_analysis包名称模式列表,将添加到 Visual Studio 的CAExcludePath属性中。
参考¶
- class MSBuildDeps(conanfile)¶
MSBuildDeps 类生成器 conandeps.props:无条件导入所有 *直接* 依赖项
- 参数:
conanfile –
< ConanFile 对象 >当前配方对象。始终使用self。
- configuration¶
定义构建类型。默认值为
settings.build_type。
- configuration_key¶
定义用于有条件选择要导入的属性表(默认为
"Configuration")的配置键。
- platform¶
平台名称,例如,如果
settings.arch == "x86",则为Win32。
- platform_key¶
定义用于有条件选择要导入的属性表(默认为
"Platform")的平台键。
- exclude_code_analysis¶
包名称模式列表,将添加到 Visual Studio
CAExcludePath属性中,每个匹配项作为其conan_[DEP]_[CONFIG].props的一部分。默认情况下,值为tools.microsoft.msbuilddeps:exclude_code_analysis配置提供的值。
- generate()¶
将
conan_<pkg>_<config>_vars.props,conan_<pkg>_<config>.props, 和conan_<pkg>.props文件生成到conanfile.generators_folder中。