- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
当我创建 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 的“include”和 PropertyGroup 的“condition”之间的区别。
最佳答案
首先,您错过了粘贴一个重要部分(因此您显示的是无效的 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 Item 基本上用作一个列表,告诉构建系统,包括 VS 中的 gui,项目存在哪些配置/平台组合。
Properties在 PropertyGroup 中定义,只是键/值对。 Condition PropertyGroup 上的属性导致其内部的属性仅在条件匹配时才被定义。因此,虽然 Include 和 Condition 都是 xml 属性,但它们的用途完全不同:第一个在 Item 中使用,向 Item 集合添加一个元素,而第二个是条件(顺便说一下,它也可以放在几乎所有其他 msbuild 上元素,因此也在 Item 或 ItemGroup 上),当评估为 False 时丢弃内容。
When I run the following:
MSBuild.exe MyProject.vcxproj /p:Configuration=Debug /p:Platform=Win32
Which is being applied? Are they combined into one?
通过 /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 而不是它会得到值“false”。这最终用于更改执行的编译器/链接器命令,并向其传递一个标志以告知要使用哪个运行时库。
关于c++ - ProjectConfiguration 与 PropertyGroup (MSBuild),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41526822/
当我创建 C++ Visual Studio 项目时,我在 MSBuild 的项目文件中得到以下内容: Debug Win32 Application true
我们有一个大型(约 800 个单独的项目)系统,我们正在从旧的构建系统迁移到 Visual Studio 2010。在过去的几周里,我们为每个项目手动创建了 Visual Studio 项目文件(.v
我是一名优秀的程序员,十分优秀!