我正在尝试彻底检查我的项目的构建过程。我们有大约 330 个 Visual C++ 项目,我们在去年从 Visual Studio 2005 升级到了 Visual Studio 2013。我想利用 MSBuild 来改进我们现在拥有的非常串行的构建脚本的构建时间。我已经完成了粗略的第一次通过,并将发布版本的构建时间从约 2 小时减少到约 20 分钟。在做这个的过程中,我将很多常用的项目设置合并到一个.props file .在这样做的过程中,我遇到了一个绊脚石。
我希望将平台工具集从一个 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 中吗?
第二个问题:我是否应该以这种方式弄乱平台工具集,或者我是否会让自己面临以后维护噩梦的风险?
最佳答案
将常用设置提取到单独的 .props 文件和 <Import>
是非常好的做法。从所有项目。我对我的项目做同样的事情,包括配置 PlatformToolset
.props 文件中的属性,我以这种方式构建它没有问题。
与此相关的几点:
PlatformToolset
没有什么特别之处属性(property),或与此有关的任何其他属性(property)。在 .props 文件中配置属性与直接在 .vcxproj 文件中设置属性相同(但是请参阅下面关于排序的观点)。当然,也有一些内置属性,您根本无法配置,但它们始终是只读属性。 msbuild mysolution.sln /p:Platform=x86
将使用平台属性设置为 x86
构建所有内容,并在项目中覆盖不生效)。 <Import>
.props 文件的命令总是能够通过设置 .props 文件的绝对路径来定位 .props 文件。其次,确保您指定 Label
<PropertyGroup>
的属性配置文件中的元素,就像在 .vcxproj 文件中指定的一样。 <Import>
元素在正确的位置。通常你希望它是第一个导入,在你导入标准 .targets 和 .props 之前,比如 Microsoft.Cpp.defaults.props 等。原因是 msbuild 通过对语句执行顺序扫描来工作,所以指令的顺序很重要. 为了使 #3 和 #4 更容易,这里有一个技巧来指定 .props 文件的绝对路径。假设您的解决方案名称是 MySolution.sln 并且自定义 Prop 文件是 MyCustomProps.props,放置在解决方案所在的同一目录中:
<PropertyGroup>
<RootFolder>$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory),MySolution.sln))</RootFolder>
</PropertyGroup>
<Import Project="$(RootFolder)\MyCustomProps.props" />
关于visual-studio - MSBuild 继承平台工具集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25026731/