我正在尝试彻底检查项目的构建过程。我们有去年从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>
。
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中?
第二个问题:我是否应该以这种方式搞乱平台工具集?或者我是否会在以后面临维护噩梦的风险?
答案 0 :(得分:5)
将通用设置提取到单独的.props文件和<Import>
来自所有项目是非常好的做法。我对我的项目做了同样的事情,包括在.props文件中配置PlatformToolset
属性,我没有遇到任何问题。
与此相关的几点:
PlatformToolset
属性或任何其他属性没有什么特别之处。配置.props文件中的属性与直接在.vcxproj文件中设置它相同(但请参阅下面关于排序的观点)。当然,有一些内置属性,您根本无法配置,但这些属性始终是只读属性。 msbuild mysolution.sln /p:Platform=x86
将使用Platform属性设置为{{1项目中的覆盖和覆盖不会生效。 x86
命令始终能够通过设置.props文件的绝对路径来找到.props文件。其次,确保为配置文件中的<Import>
元素指定Label
属性,就像在.vcxproj文件中指定的那样。<PropertyGroup>
元素位于正确的位置。通常你希望它在导入标准.targets和.props之前是第一个Import,比如Microsoft.Cpp.defaults.props等。原因是msbuild通过对语句执行顺序扫描来工作,因此指令的顺序很重要为了使#3和#4更容易,这里是一个指定.props文件的绝对路径的技巧。假设您的解决方案名称是MySolution.sln,自定义道具文件是MyCustomProps.props,放在解决方案所在的同一目录中:
<Import>