【问题标题】:ProjectConfiguration versus PropertyGroup (MSBuild)ProjectConfiguration 与 PropertyGroup (MSBuild)
【发布时间】:2017-01-07 21:35:05
【问题描述】:

当我创建一个 C++ Visual Studio 项目时,我在我的 MSBuild 项目文件中得到以下内容:

<ProjectConfiguration Include="Debug|Win32">
    <Configuration>Debug</Configuration>
    <Platform>Win32</Platform>
</ProjectConfiguration>

<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
    <ConfigurationType>Application</ConfigurationType>
    <UseDebugLibraries>true</UseDebugLibraries>
    <PlatformToolset>v140</PlatformToolset>
    <CharacterSet>Unicode</CharacterSet>
</PropertyGroup>

我不明白这两个部分之间有什么区别。当我运行以下命令时:

MSBuild.exe MyProject.vcxproj /p:Configuration=Debug /p:Platform=Win32

应用的是什么?它们合二为一吗?我不明白 ProjectConfiguration 的“包含”和 PropertyGroup 的“条件”之间的区别。

【问题讨论】:

标签: c++ visual-studio configuration msbuild platform


【解决方案1】:

首先,您错过了粘贴重要部分(因此您显示的不是有效的 msbuild 语法):“ProjectConfiguration”是 Item,因为它位于 ItemGroup 内部。所以完整的定义实际上是,例如:

<ItemGroup>
  <ProjectConfiguration Include="Debug|Win32">
    <Configuration>Debug</Configuration>
    <Platform>Win32</Platform>
  </ProjectConfiguration>
  <ProjectConfiguration Include="Release|Win32">
    <Configuration>Debug</Configuration>
    <Platform>Win32</Platform>
  </ProjectConfiguration>
</ItemGroup>

这定义了一个名为 ProjectConfiguration 的列表/数组/集合/“随便你怎么称呼它”,其中包含 2 个元素。第一个元素是“Debug|Win32”,有 2 个Metadata 项目:第一个名为“Configuration”,值为“Debug”,第二个名为“Platform”,值为“Win32”。 ProjectConfiguration 项基本上是一个列表,告诉构建系统,包括 VS 中的 gui,项目存在哪些配置/平台组合。

Properties 在 PropertyGroup 中定义,只是键/值对。 PropertyGroup 上的 Condition 属性导致其中的属性仅在条件匹配时才被定义。因此,虽然 Include 和 Condition 都是 xml 属性,但它们的用途完全不同:第一个在 Item 中使用,将元素添加到 Item 集合,而第二个是条件(顺便说一下,它也可以放置在几乎所有其他 msbuild元素,因此在 Item 或 ItemGroup 上也是如此),当评估为 False 时会丢弃内容。

当我运行以下命令时:MSBuild.exe MyProject.vcxproj /p:Configuration=Debug /p:Platform=Win32 正在应用哪个?它们合二为一吗?

传递/p 在命令行上定义属性,与在PropertyGroup 中定义的属性没有什么不同(此外,在命令行上定义的属性通常会覆盖项目文件中指定的属性)。现在对于 ItemGroup,这与您在命令行上传递的内容没有区别:它仍然包含告诉构建系统哪些组合可用的 2 个元素。它确实改变了哪些属性生效。考虑:

<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
  <UseDebugLibraries>true</UseDebugLibraries>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
  <UseDebugLibraries>false</UseDebugLibraries>
</PropertyGroup>

$() 语法用于扩展属性值,因此如果您在命令行上传递 /p:Configuration=Debug;Platform=Win32 则 '$(Configuration)|$(Platform)'=='Debug|Win32' " 解析和评估后将扩展为 'Debug|Win32'=='Debug|Win32'" 反过来评估为 True。因此,第一个 PropertyGroup 定义生效,但不是第二个,因为后者的条件不匹配。结果,名为“UseDebugLibraries”的属性获得了值“true”。如果您传递 /p:Configuration=Release;Platform=Win32 而不是它会得到值“假”。这最终用于更改执行的编译器/链接器命令并向其传递一个标志以告知要使用哪个运行时库。

【讨论】:

  • 你能不能把两者结合起来,即把 PropertyGroup 的元素添加到 ProjectConfiguration 因为 Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" 将始终匹配包括="Debug|Win32"?
  • 你可以这样做,但这并不等同:像 ProjectConfiguration 这样的 Item 有多个元素,一个属性只是一个键/值对..
  • 这对我也有帮助。 OP - 这可以标记为答案吗?
猜你喜欢
  • 1970-01-01
  • 2018-12-25
  • 1970-01-01
  • 2011-09-14
  • 1970-01-01
  • 1970-01-01
  • 2018-11-27
  • 1970-01-01
  • 2011-01-06
相关资源
最近更新 更多