C#控制台应用程序始终会重建,但是我已经跟踪了诊断构建输出

时间:2019-12-20 22:49:11

标签: visual-studio msbuild rebuild

关于如何解决“我什么都没做,所以VS为什么重建我的项目”的问题,我看了很多页面。而且,它们对于解决“始终复制”标志和始终运行的自定义构建步骤的许多问题很有帮助。但是我留下了一个不会消失的人。它通过了所有最新的快速相关性检查,但无论如何仍会继续开始构建。我已经在诊断级别上跟踪了所有MSBuild输出,但是我认为“正常”(并非最小)级别足以指向正确的方向。输出如下:

1>------ Build started: Project: OnePawDataSerializer, Configuration: Debug x64 ------
1>Build started 12/20/2019 5:04:37 PM.
1>GenerateTargetFrameworkMonikerAttribute:
1>Skipping target "GenerateTargetFrameworkMonikerAttribute" because all output files are up-to-date with respect to the input files.
1>CoreCompile:
1>Skipping target "CoreCompile" because all output files are up-to-date with respect to the input files.
1>_CopyFilesMarkedCopyLocal:
1>  Touching "D:\Volpe\NuCS-HiEx\NuCS-Repo\Applications\FAB4DA\OnePawDataSerializer\obj\x64\Debug\OnePawDataSerializer.csproj.CopyComplete".
1>_CopyAppConfigFile:
1>Skipping target "_CopyAppConfigFile" because all output files are up-to-date with respect to the input files.
1>CopyFilesToOutputDirectory:
1>  OnePawDataSerializer-> D:\Volpe\NuCS-HiEx\NuCS-Repo\Applications\FAB4DA\bin\Debug64\OnePawDataSerializer.exe
1>
1>Build succeeded.
1>    0 Warning(s)
1>    0 Error(s)
1>
1>Time Elapsed 00:00:00.20
========== Build: 1 succeeded, 0 failed, 15 up-to-date, 0 skipped ==========

在此级别的输出详细度上,它不会显示所有看起来像这样的东西:

1>------ Up-To-Date check: Project: CommonDataModelUtilities, Configuration: Debug x64 ------
1>All outputs are up-to-date.
1>Time Elapsed 19 ms

但是它们都表明一切都是最新的。在“正常”级别的输出中,它显示了几个内部目标被跳过,但是随后似乎需要执行一个名为“ _CopyFilesMarkedCopyLocal”的目标,该目标似乎并没有实际复制任何内容,但确实可以执行创建一个文件,该文件的项目名称后面应加上“ .CopyComplete”。这似乎是该构建实际上“做”有形事情的唯一实例,因此我倾向于怀疑这与为什么我没有看到此事有关: ========== Build: 0 succeeded, 0 failed, 16 up-to-date, 0 skipped ========== 当我建立。但是我不知道为什么这样做。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

  

这似乎是构建中唯一实际“执行”的实例   有形的东西,所以我倾向于怀疑这有一些东西   与为什么我看不到此内容有关:===========构建:0成功,0   失败,最新16条,我跳过0条==========但是我不能   弄清楚为什么这样做。有什么想法吗?

MSBuild使用增量编译,该编译仅编译已修改的文件,而跳过未更改的文件的编译。因此,当再次构建项目而不进行任何更改时,它将如您所愿:

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

这是MSBuild生成的正常行为。

但是,如果您在不更改任何项目文件的情况下再次构建项目并始终执行构建,恐怕是由于某些项目文件的设置(将Copy to Output Directory设置为{ {1}})。 (或者您可以在xxx.csproj文件中看到文件,然后您会发现一些文件添加了节点Copy Always

enter image description here

根据图片中的构建日志信息,目标<CopyToOutputDirectory>Always</CopyToOutputDirectory>_CopyFilesMarkedCopyLocal负责将您指定的项目资源(如图片所示)复制到输出路径。并且,当您将文件设置为始终复制时,MSBuild将始终认为该操作是最新的,因此它将始终执行。

注意:生成是msbuild执行一堆目标目标的过程,其中包含编译目标。如果文件已被编译且未更改,则目标将跳过。此外,如果某些项目未更改,则MSBuild将跳过编译,并将其视为最新-

为了证明我已经做了测试:

1)如上图所示,我将名为JavaScript1.js的项目文件设置为CopyFilesToOutputDirectory

2)然后,当我多次构建项目时,总会导致构建成功执行。

enter image description here

此外,如果您想要这种行为,可以将Copy Always设置为Copy to Output Directory。或者,如果您要输出这些文件,则可以设置为Do not copy

希望它可以为您提供帮助。