MSBuild继承平台工具集

Kev*_*n K 3 msbuild build visual-studio

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

我希望将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" />
Run Code Online (Sandbox Code Playgroud)

然后我<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中吗?

第二个问题:我是否应该以这种方式搞乱平台工具集?或者我为自己设置维护噩梦的风险?

sev*_*tov 5

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

与此相关的几点:

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

为了使#3和#4更容易,这里是一个指定.props文件的绝对路径的技巧.假设您的解决方案名称是MySolution.sln,自定义道具文件是MyCustomProps.props,放在解决方案所在的同一目录中:

<PropertyGroup>
       <RootFolder>$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory),MySolution.sln))</RootFolder>
</PropertyGroup>
<Import Project="$(RootFolder)\MyCustomProps.props" />
Run Code Online (Sandbox Code Playgroud)

  • Seva,谢谢你的投入!似乎第4点(`<Import>`location)是我的问题.PropertySheets,当通过Visual Studio添加时,通过名为`"PropertySheets"的`ImportGroup`导入,``PropertySheets``出现在`PropertyGroup"配置"`下面.您对路径的诀窍非常受欢迎,但我们在多个解决方案之间共享项目并不总是一致的.当我们移动源控制提供程序时,这可能会发生变化,所以我会在那里提出一些一致性的请求. (2认同)