MSBuild继承平台工具集

时间:2014-07-29 23:49:35

标签: visual-studio build msbuild

我正在尝试彻底检查项目的构建过程。我们有去年从Visual Studio 2005升级到Visual Studio 2013的~330个Visual C ++项目。我想利用MSBuild来改善我们现在的串行构建脚本的构建时间。我已经完成了粗略的第一遍,并将发布版本的构建时间从大约2小时减少到大约20分钟。在执行此操作的过程中,我正在将许多常见项目设置合并到.props file 中。在这样做的过程中,我遇到了绊脚石。

我希望将Platform Toolset从一个VSProps文件继承到包含它的所有项目。在我创建的新.props文件的顶部,我输入以下内容:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ImportGroup Label="PropertySheets" />
<PropertyGroup Label="Configuration">
   <PlatformToolSet>v120</PlatformToolSet>
</PropertyGroup>
<PropertyGroup Label="UserMacros" />

然后我从各个项目文件中删除了相应的<PlatformToolSet>v120</PlatformToolset>

唉,事情已经开始走下坡路了。项目(在Visual Studio 2013中)现在在解决方案资源管理器中说CoreGeometry (Visual Studio 2010),项目本身似乎想要引用v100平台工具集。当我建立时,它然后抱怨我:

C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V120\Microsoft.CppBuild.targets(362,5): warning MSB8003: Could not find WindowsSDKDir variable from the registry. TargetFrameworkVersion or PlatformToolset may be set to an invalid version number.

1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V120\Microsoft.CppCommon.targets(341,5): error MSB6006: "CL.exe" exited with code -1073741515.

我能够解决这个问题的唯一方法是在.vcxproj上手动设置PlatformToolset,这并不可怕,我只是有点恼火,其他所有属性似乎都继承了,但是PlatformToolset没有。

我的问题是: 我是否可以使用.props文件将公共PlatformToolSet继承到未指定平台工具集的.vcxproj中?

第二个问题:我是否应该以这种方式搞乱平台工具集?或者我是否会在以后面临维护噩梦的风险?

1 个答案:

答案 0 :(得分:5)

将通用设置提取到单独的.props文件和<Import>来自所有项目是非常好的做法。我对我的项目做了同样的事情,包括在.props文件中配置PlatformToolset属性,我没有遇到任何问题。

与此相关的几点:

  1. PlatformToolset属性或任何其他属性没有什么特别之处。配置.props文件中的属性与直接在.vcxproj文件中设置它相同(但请参阅下面关于排序的观点)。当然,有一些内置属性,您根本无法配置,但这些属性始终是只读属性。
  2. 唯一一种无法覆盖属性的情况,如果属性值直接从构建的命令行传递(例如msbuild mysolution.sln /p:Platform=x86将使用Platform属性设置为{{1项目中的覆盖和覆盖不会生效。
  3. 解释项目的msbuild引擎与显示项目设置的Visual Studio之间存在差异。在某些情况下,您可能会发现在重构.vcxproj文件后,某些标准项目配置对话框未显示您在.props文件中配置的信息。要解决此问题,请确保.props文件的x86命令始终能够通过设置.props文件的绝对路径来找到.props文件。其次,确保为配置文件中的<Import>元素指定Label属性,就像在.vcxproj文件中指定的那样。
  4. 最后,确保您的<PropertyGroup>元素位于正确的位置。通常你希望它在导入标准.targets和.props之前是第一个Import,比如Microsoft.Cpp.defaults.props等。原因是msbuild通过对语句执行顺序扫描来工作,因此指令的顺序很重要
  5. 为了使#3和#4更容易,这里是一个指定.props文件的绝对路径的技巧。假设您的解决方案名称是MySolution.sln,自定义道具文件是MyCustomProps.props,放在解决方案所在的同一目录中:

    <Import>