MSBuildDeps

MSBuildDeps 是 Microsoft MSBuild 构建系统的依赖信息生成器。它将生成多个 xxxx.props 属性文件,每个文件对应一个软件包的依赖项,供使用 MSBuild 或 Visual Studio 的使用者使用,只需将生成的属性文件添加到解决方案和项目中即可。

MSBuildDeps 生成器可以通过名称在 conanfile 中使用

conanfile.py
class Pkg(ConanFile):
    generators = "MSBuildDeps"
conanfile.txt
[generators]
MSBuildDeps

它也可以在 conanfile 的 generate() 方法中完全实例化

conanfile.py
from conan import ConanFile
from conan.tools.microsoft import MSBuildDeps

class Pkg(ConanFile):
    settings = "os", "compiler", "arch", "build_type"
    requires = "zlib/1.2.11", "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: 相同的 Conanzlibxxxx 变量,用于 zlib 依赖项,Debug 配置

  • conan_zlib_release_x64.props: 激活当前构建中的 Conanzlibxxxx 变量作为标准 C/C++ 构建配置,Release 配置。此文件还包含传递依赖项定义。

  • conan_zlib_debug_x64.props: 相同的 Conanzlibxxxx 变量激活,Debug 配置,也包含传递依赖项。

  • conan_zlib.props: zlib 的属性文件。它有条件地包含,根据配置,包含上面两个 Release/Debug 属性文件中的一个。

  • 每个图中的依赖项都生成相同的 5 个文件,在本例中也生成 conan_bzip.props,它有条件地包含 Release/Debug bzip 属性文件。

  • conandeps.props: 属性文件,包含所有直接依赖项,在本例中为 conan_zlib.propsconan_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 项目定义了自定义配置,例如 ReleaseSharedMyCustomConfig,则可以将其定义到 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.2.11"

    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 arch

MSBuild Platform

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,例如测试框架,如 gtestcatch

  • 这些直接依赖项的所有传递 requires(全部位于 host 上下文中)

  • 构建上下文中的工具要求,即在构建机器中运行的应用程序和可执行文件,与目标平台无关,专门添加到 <ExecutablePath> 属性,从 $(Conan{{name}}BinaryDirectories) 定义的属性中获取值。这允许定义自定义构建命令,调用代码生成工具,使用 <CustomBuild><Command> 元素。

自定义

conf

MSBuildDeps 受以下 [conf] 变量的影响

  • tools.microsoft.msbuilddeps:exclude_code_analysis 要添加到 Visual Studio CAExcludePath 属性的软件包名称模式列表。

参考

class MSBuildDeps(conanfile)

MSBuildDeps 类生成器 conandeps.props:仅无条件导入所有 direct 依赖项

参数:

conanfile< ConanFile object > 当前 recipe 对象。始终使用 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 中。