如何准确找出 Visual Studio 2019 重新构建未修改的 .NET Core 项目的原因

3
我正在构建一个包含.NET Standard 2.0和.NET Core 2.0项目(C#和F#)的解决方案,使用VS2019(16.1.1)。如果我多次构建而没有更改,则第二次及以后的构建应显示“Build: 0 succeeded, 0 failed, X up-to-date”,但有时会每次都重新构建某些项目。我如何确切地找出原因?
有许多与此相关的SO问题和博客文章,其中大部分建议将生成日志详细程度设置为“诊断”,并查找“不是最新的”。我已经这样做了,但找不到该字符串,也找不到“not up-to-date”(但“up-to-date”出现了很多次)。所以这似乎在VS2019中已经更改了。我还知道U2DCheckVerbosity注册表设置,但那只适用于.NET Framework。阅读生成日志输出是不现实的,因为它有超过360,000行,所以我需要知道要搜索什么。
请注意,我不是在寻找关于问题可能是什么的猜测- 我正在寻找一种让VS /编译器告诉我的方法。

不要将详细程度设置为诊断,而是将其设置为详细以查找过时的资源。 - C.J.
嗨Em0,这个问题有什么新进展吗?你检查过那些选项是否可用来解决意外重建的问题吗:) - LoLance
嗨@LanceLi-MSFT,自那以后我没有再遇到过那个具体的问题。当它(或类似的问题)不可避免地发生时,我会更新这个信息。 - EM0
当然,我们会将其归档。如有任何更新,请随时在此分享。 - LoLance
3个回答

5
我正在寻找一种方法让VS/编译器告诉我(针对VS2019)。由于难以重现同样的问题,所以我不确定你的问题的原因。但是,关于你所问的方式,在输出窗口中查找最新相关信息的方法,也许你可以检查.net core的"Up To Data Checks option"。前往Tools=>Options=>Projects and Solutions=>.net core=>Up To Data Checks。确保你已经选中了"Don't call MSBuild if a project appears to be up-to-date"。然后将"Logging Level"更改为"Info or Verbose"。(根据需要选择适当的级别)对于普通的.net framework项目或C++项目,"build and run"中的"build output verbosity"会非常有帮助。但是,当尝试找到VS认为一个".net core或.net standard"项目过期的原因时,我认为我们可以尝试这个选项,因为它的输出更加清晰。

例如:(一个依赖于标准项目的 .net Core 项目,具有 Info 级别 的 .net core 最新检查):

enter image description here

如果您在一个解决方案中有太多的项目,我建议您一次构建一个项目,而不是构建整个解决方案,这样您可以更容易地定位重新构建的原因。


谢谢,看起来正是我要找的。我现在无法重现原始问题,但它在另一个项目中发生,并且设置日志级别= INFO 识别到它有一些文件设置为“始终复制”。当原始问题再次出现时,我会再试一次。 - EM0
很高兴知道它能帮上一些忙:) - LoLance
2
这个答案帮助我找到了 SDK-Style 项目 -> 在 VS2019 中最新检查。谢谢! - Marcin Zawiejski

1
在VS2019中控制日志记录的选项是:

enter image description here

默认值为“无”,但一般来说,“最小”设置是一个不错的选择。当设置为该级别时,每个项目仅输出一行,并且仅在该项目不是最新版本时才输出。该行将准确解释为何该项目被认为是过时的。
值得记住的是,这是Visual Studio的最新检查功能,它用于快速评估项目状态并避免与MSBuild相比较昂贵的调用。可能会出现使用奇特的项目配置,导致VS确定需要构建您的项目,但实际上MSBuild并没有构建的情况。虽然这种情况很少见,但如果您在此处调试问题,了解这一点可能是有益的。

1

VS会写一个名为NETCoreApp,Version=v2.0.AssemblyAttributes.cs的文件到临时文件夹中。如果您构建了几个 .net core 项目,则该文件将被其他项目更改,使得您的 VS 认为旧项目已被修改并进行了构建。

将生成的文件移动到项目中以减少构建:

<PropertyGroup>
    <TargetFrameworkMonikerAssemblyAttributesFileClean>False</TargetFrameworkMonikerAssemblyAttributesFileClean>
    <TargetFrameworkMonikerAssemblyAttributesPath>$(MSBuildThisFileDirectory)SharedAssemblyAttributes.cs</TargetFrameworkMonikerAssemblyAttributesPath>
</PropertyGroup>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接