Visual Studio不会触发MSBuild

时间:2018-04-17 16:23:30

标签: c# visual-studio msbuild visual-studio-2017

我已经创建了自己的目标文件,在构建过程中运行自定义工具会生成一些C#代码,然后包含在.csproj中。

我有类似的东西。

<Project Sdk="Microsoft.NET.Sdk" InitialTargets="MyTarget">
  .....

  <Import Project="MyTargetsFile.targets" />

  <ItemGroup>
    <XYZ Include="**\*.xyz" />
  </ItemGroup>

</Project>

如果我更改了.xyz 可视工作室,我遇到的问题会触发重建因为它认为它是最新的。另一方面,如果我运行msbuild Systems.csproj /v:diag > Build.log,它会检测到更改并重建项目。

经过一番研究后,我得出的结论是VS在这种情况下甚至不会触发MSBuild。在我看来,visual studio只检查.cs个文件是否有变化,而忽略了其余部分。

现在我的问题是,如果我在.xyz文件中进行了更改,我该如何让VS触发msbuild?

我正在使用 Visual Studio Enterprise 2017版本15.6.6

更新

我知道我可以将文件的构建操作设置为Compile但它们包含.xml并导致错误。

我也知道我可以清理项目并构建,但我对增量构建不感兴趣

2 个答案:

答案 0 :(得分:1)

  

Visual Studio不会触发MSBuild

你的意思是如果改变.xyz

,Visual Studio不会触发MSBuild

这取决于.xyz文件的构建操作。如果将该文件的构建操作设置为 C#compiler ,则在更改该文件的内容时,VS / MSBuild将编译此文件以检查此文件的内容。如果它被更改,它将认为它不是最新的,然后触发MSBuild。

.cs文件的默认构建操作是C#编译器,其余文件的默认构建操作大多数应为。当我们添加带有构建操作的文件时,VS / MSBuild将不会检查此文件的内容,只检查此文件的输入和输出。这就是为什么Visual Studio在您更改.xyz时不会触发MSBuild的原因。

例如,当我们在Visual Studio中添加构建操作的文本文件时,请构建项目。然后我更改了文本文件中的一些内容,再次构建项目,它不会触发MSBuild。

如果我们想在更改文本文件后触发MSBuild ,我们建议清除构建以删除输出,然后当我们再次构建它时,将触发MSBuild。

然后我将文件的构建操作更改为C#编译器(为了避免引入编译错误,我在此文件中使用空格而不是代码。),在此项目更新后,我用空格更改文本文件,再次构建项目,Visual studio触发MSBuild。

希望这有帮助。

答案 1 :(得分:0)

经过大量的谷歌搜索,我找到了解决方案,不一定是最好的解决方案,但它似乎可以完成这项工作。

如问题中所述,我的问题是vs没有触发msbuild。看起来为了让msbuild始终运行(这并不意味着你得到一个完整的构建eveytime,它只是意味着你让msbuild决定做什么而不是vs)你必须添加

<PropertyGroup>
    <DisableFastUpToDateCheck>True</DisableFastUpToDateCheck>
</PropertyGroup>

MSDN说明以下关于DisableFastUpToDateCheck

的内容
  

仅适用于Visual Studio的布尔值。 Visual Studio   构建管理器使用名为FastUpToDateCheck的进程来确定   是否必须重建项目以使其保持最新状态。这个过程是   比使用MSBuild确定这个更快。设置   DisableFastUpToDateCheck属性为true允许您绕过Visual   Studio构建管理器并强制它使用MSBuild来确定是否   该项目是最新的。

解决问题的另一种方法虽然我不确定它是否适合所有人,但是将构建操作设置为Embedded resource