visual-studio - MSBuild 继承平台工具集

标签 visual-studio build msbuild

我正在尝试彻底检查我的项目的构建过程。我们有大约 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 构建所有内容,并在项目中覆盖不生效)。
  • 解释项目的 msbuild 引擎和显示项目设置的 Visual Studio 之间存在差异。在某些情况下,您可能会发现在重构 .vcxproj 文件后,一些标准项目配置对话框未显示您在 .props 文件中配置的信息。为了缓解这种情况,请确保您的 <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/

    相关文章:

    c# - 搜索功能概念

    c++ - 更改命令行 Qt5 源构建的配置的正确/快速方法

    c# - 使用 MSBuild 发布 VSTO 加载项会出现错误 : The "SignFile" task failed unexpectedly. System.ArgumentNullException:值不能为空

    visual-studio-2010 - 包含引用项目的 .config 文件

    tfs - 生成 MSI 作为 TFS 构建的一部分

    c# - 每次切换到另一个选项卡时如何阻止 T4 执行?

    visual-studio - 英特尔 Fortran - chkstk.asm 未找到

    c# - Vista 从安装程序安排任务

    android - 构建 apk 时如何减小 xml Assets 的大小

    Reactjs -/dist 文件夹只有 2 个文件 - bundle.js 和 bundle.js.map - 不包含任何其他文件