c++ - 自定义构建文件更改不会触发 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 >> 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 之外。
解决方案
啊哈!!在这篇文章中找到它。事实证明,Visual Studio 绕过了 msbuild 并使用其他一些标准来验证项目是否是最新的。如果条件失败,则在该项目上运行 msbuild。
要覆盖 Visual Studio 行为,请在项目 xml 的 Globals 属性组中将属性 DisableFastUpToDateCheck 设置为 true:
<PropertyGroup Label="Globals">
<!-- Other Global Property Settings -->
<DisableFastUpToDateCheck>true</DisableFastUpToDateCheck>
</PropertyGroup>
它已经完成了......我想知道是否有一种方法可以告诉 Visual Studio FastUpToDateCheck 机制也要注意自定义构建文件??????上面的解决方案现在就足够了。
推荐阅读
- sql - Gorm 仅在一个模型上的多对一外键
- javascript - 存在同名输入时获取表单属性
- matlab - 需要帮助编写一个脚本来计算由小数整数索引的总和(如 1.5、2.5、3.5...)
- python - 是否可以在 Python 中按列而不是行与一个固定系列进行运行关联?
- html - 如何在 div 中创建文本自动段落?
- javascript - 如何在执行类的每个方法之前触发自定义代码
- php - 从表单将数组插入 MySQL 数据库
- sql - 优化 postgres 上的窗口功能(每个帐户保留 n 个最近记录)
- ios - 录制视频时切换相机?
- jsxgraph - 如何访问 JSXgraph 积分的显示值?