首页 > 解决方案 > 自定义构建文件更改不会触发 VS 2017 中的项目重建

问题描述

在我的 C++ VS 项目中,我添加了一个自定义目标来编译着色器文件并将其设置为初始目标。这是项目xml

<Project InitialTargets="CompileShaders" DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
 
 ..... Normal Default VS C++ content here ......

 <ItemGroup>
    <GLSLShader Include="SPIR-V\canvas2D.vert" />
    <GLSLShader Include="SPIR-V\canvas2D.frag" />
</ItemGroup>
 
  
  
  <Target Name="CompileShaders" Inputs="@(GLSLShader)" Outputs="SPIR-V\shaders_bytecode.h" >
    <PropertyGroup>
      <OriginalFileName>%(GLSLShader.Filename)%(GLSLShader.Extension)</OriginalFileName>
    </PropertyGroup>
    <Message Text="Start Compiling GSLANG @(GLSLShader) " />
    <Message Condition="'$(VULKAN_SDK)'==''" Text="Error, cant find environment variable VULKAN_SDK, Make sure that the  Lunar  Vulkan SDK is installed" />
    <Message Condition="'$(VULKAN_SDK)'!=''" Text="$(VULKAN_SDK)\Bin\glslangValidator.exe %(GLSLShader.Filename)%(GLSLShader.Extension) -V --vn $([System.String]::Copy('%(GLSLShader.Filename)%(GLSLShader.Extension)').Replace('.','_')) -o %(GLSLShader.Filename)%(GLSLShader.Extension).h" />
    <Exec Condition="'$(VULKAN_SDK)'!=''" Command="$(VULKAN_SDK)\Bin\glslangValidator.exe %(GLSLShader.Filename)%(GLSLShader.Extension) -V --vn $([System.String]::Copy('%(GLSLShader.Filename)%(GLSLShader.Extension)').Replace('.','_')) -o %(GLSLShader.Filename)%(GLSLShader.Extension).h" WorkingDirectory="$(ProjectDir)\SPIR-V" />
    <Exec Condition="'$(VULKAN_SDK)'!=''" Command="del shaders_bytecode.h" WorkingDirectory="$(ProjectDir)\SPIR-V" />
    <Exec Condition="'$(VULKAN_SDK)'!=''" Command="type %(GLSLShader.Filename)%(GLSLShader.Extension).h &gt;&gt; shaders_bytecode.h" WorkingDirectory="$(ProjectDir)\SPIR-V" />
    <Exec Condition="'$(VULKAN_SDK)'!=''" Command="del %(GLSLShader.Filename)%(GLSLShader.Extension).h" WorkingDirectory="$(ProjectDir)\SPIR-V" />
    
  </Target>
</Project>

如果我更改任何 .cpp .h 文件并构建解决方案,着色器将与项目的其余部分一起编译,但如果我仅更改着色器文件(即 SPIR-V\canvas2D.vert),则不会构建项目。VS 说项目是最新的。

现在奇怪的是,如果我在 VS 外的终端上使用 msbuild 运行项目,着色器文件的更改足以触发重建。去搞清楚....!!!

它看起来与 VS 如何构建项目有关。它在 msbuild 之外。

标签: c++msbuildvisual-studio-2017

解决方案


啊哈!!在这篇文章中找到它。事实证明,Visual Studio 绕过了 msbuild 并使用其他一些标准来验证项目是否是最新的。如果条件失败,则在该项目上运行 msbuild。

要覆盖 Visual Studio 行为,请在项目 xml 的 Globals 属性组中将属性 DisableFastUpToDateCheck 设置为 true:

<PropertyGroup Label="Globals">
    <!-- Other Global Property Settings -->
    <DisableFastUpToDateCheck>true</DisableFastUpToDateCheck>
</PropertyGroup>

它已经完成了......我想知道是否有一种方法可以告诉 Visual Studio FastUpToDateCheck 机制也要注意自定义构建文件??????上面的解决方案现在就足够了。


推荐阅读