【问题标题】:Why does Visual Studio keep building files that have not changed?为什么 Visual Studio 会不断构建未更改的文件?
【发布时间】:2022-08-15 01:27:39
【问题描述】:

我正在使用 Visual Studio Enterprise 2019,我很好奇我注意到了很长时间但从未问过的东西,因为它没有破坏任何东西:构建解决方案时,最终消息如下所示:

========== Build: 37 succeeded, 0 failed, 168 up-to-date, 0 skipped ==========

我的理解是 VS 只会构建更改的文件(直接或通过依赖项)。但情况似乎并非如此,这是我在上面提到的第一个构建之后背靠背运行多个构建并且不对解决方案的任何部分进行任何更改后得到的结果:

========== Build: 15 succeeded, 0 failed, 190 up-to-date, 0 skipped ==========

========== Build: 5 succeeded, 0 failed, 200 up-to-date, 0 skipped ==========

========== Build: 16 succeeded, 0 failed, 189 up-to-date, 0 skipped ==========

========== Build: 5 succeeded, 0 failed, 200 up-to-date, 0 skipped ==========

========== Build: 22 succeeded, 0 failed, 183 up-to-date, 0 skipped ==========

....等等。

但我不记得曾经得到:

========== Build: 0 succeeded, 0 failed, 205 up-to-date, 0 skipped ==========

为什么?

注:我在较小的解决方案中看到“0 成功”,所以它不像永远不会发生

    标签: visual-studio msbuild


    【解决方案1】:

    项目是 MSBuild 文件。 MSBuild 直接或隐式地尝试根据输出检查输入以确定是否应运行目标。

    在“诊断”的最高详细级别上,MSBuild 将提供有关为什么要构建项目的信息。

    但是,没有特定的顺序,以下是一些会导致项目始终构建的常见情况:

    1. 如果项目中的文件将“复制到输出目录”属性设置为“始终复制”,则项目将始终构建以完成复制。
      • 使用“如果较新则复制”而不是“始终复制”。
      • 在 MSBuild 中,此属性是 CopyToOutputDirectory 属性,值 AlwaysPreserveNewest 分别是“始终复制”和“如果更新则复制”。
    2. 在 C# 项目中,GUI 项目设置中提供的构建前和构建后步骤/事件将导致项目始终构建。同样,在 C++ 项目中,PreBuildEvent、PreLinkEvent 和 PostBuildEvent 也有同样的问题。
      • 这些项目不提供指定输出,MSBuild 必须始终构建项目,因为没有输出它无法确定步骤是否已经满足。
      • 这些项目只是为了运行 shell 命令而脱壳,并且大多数情况下,shell 命令是一个复制命令。 MSBuild Copy 任务可以替换这样的用法。 Copy 任务具有隐式输入和输出并在进程中运行。其他命令可以通过Exec 任务运行。
    3. 在 C++ 项目中,未指定输出的 CustomBuildStep 将导致项目始终构建。
      • CustomBuildStep 支持指定输出,但如果未指定输出,CustomBuildStep 将始终运行。
    4. 被复制或以其他方式注入的文件被视为输出,但其时间戳始终早于相关输入。
      • 即自输出的时间戳以来输入已经改变,因此输出必须是“产生的”。

    【讨论】:

      猜你喜欢
      • 2011-02-10
      • 1970-01-01
      • 2019-03-04
      • 1970-01-01
      • 2012-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多