我已经创建了自己的目标文件,在构建过程中运行自定义工具会生成一些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并导致错误。
我也知道我可以清理项目并构建,但我对增量构建不感兴趣。
答案 0 :(得分:1)
Visual Studio不会触发MSBuild
你的意思是如果改变.xyz
?
这取决于.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
。