Visual Studio每次运行时都会构建项目

我在Visual Studio 2010中有一个带有大量项目的.NET解决方案。 直到最近,当我从IDE中运行启动项目时,只有在启动项目或其中一个依赖项目中对代码进行了更改时,才会构建项目。

大约两周前,我注意到每次运行启动项目时,Visual Studio都会构建所有项目,大约需要7分钟。 毋庸置疑,这需要花费大量时间,而且我已尽力在网上寻找解决方案,但尚未找到解决我特定问题的任何解决方案。

还有一些额外的信息 – 在我开始遇到这个问题的同时,同样的问题开始发生在我的团队中的其他人身上。

我们还使用源代码存储库。 由于我们没有更改Visual Studio中的任何设置,我怀疑有人在某些项目的源代码中无意中更改了某些内容,而现在每个项目都需要构建所有项目。

任何建议将不胜感激。

原因可能很多,所以没有你的解决方案+项目,我们只能猜测。

我处理这个问题的典型方法是通过二进制搜索缩小范围。 那是,

  1. 我建立了一切。
  2. 接下来,我在构建顺序的中间找到一些东西并构建该项目。 如果该项目所依赖的东西是罪魁祸首,那么您将遇到这个问题。 如果它不依赖的东西有问题,你就不会(也就是说它会跳过所有项目)。
  3. 现在,您重复此过程,直到将其缩小到(希望)已开始导致问题项目。

这(当然)只有在引入新问题的单个项目(可能)时才有效。

在我的特定情况下,其中一个罪魁祸首是x64项目引用x86项目,该项目未选择在x64配置中构建。

转到工具 – >选项 – >项目和解决方案 – >构建和运行。 看那里的选项。 应该检查“仅在运行时构建启动项目和依赖项”。

此外,您可以将构建输出(在相同的选项屏幕中)设置为详细或诊断,以查看是否可以找到每次构建项目的原因。

我将分享我在stackoverflow上找到的最佳答案,并结合亚马史密斯在这里接受的答案,我已经找到了问题的根本原因:

通过将Visual Studio配置为以“诊断”方式记录构建输出,如本答案中所述: https : //stackoverflow.com/a/29649259/2740778 ,输出的第一行解释了MSBuild确定重建的原因项目。

所以,如果你有,让我们说3个项目进入一个解决方案:

  • Library0
  • LIBRARY1
  • 应用

以这种方式引用:应用程序引用Library1,这个引用了Library0。 通过为Application项目选择“Build”,它第一次应该按顺序构建所有引用的项目。 但是从现在开始,如果没有进行任何更改,按下“Build”不应构建任何内容,因为MSBuild会检测到未进行更改的情况。 应显示类似的日志输出:

==========构建:0成功,0失败,3最新,0跳过==========

但是现在,如果进行了更改,如果在“Diagnostic”上有MSBuild日志输出级别,则输出窗口中的第一行将显示Visual Studio决定构建项目的原因,如下所示:

项目’Library0’不是最新的。 在输出文件’c:\ Library0 \ bin \ Debug \ Library0.pdb’之后修改输入文件’c:\ Library0 \ Class1.cs’。

根据我对这个问题的经验,只有一些项目重建,并且在最终成功之前重建失败了好几次。 它显然是由\rootprojectdir\.vs\%projectname%\v14\.suo文件损坏引起的。 这也导致相同的项目需要重建,并且每次打开VS时都会打开相同的窗口。 删除.suo文件(VS关闭时)并重新打开VS修复它:)

工具 – >选项 – >项目和解决方案 – >构建和运行

将输出详细程度设置为“Diagnostic”。 进行另一次构建后,检查输出窗口。 在每个项目构建开始时,构建系统将告诉您哪个依赖项导致构建项目。

(在我的例子中,它是一个.ico文件,意外地设置为Build Action: ResourceCopy To Output: Copy if newer 。很难找到。)

如果我每次首先检查我的设置(已经提到过)时Visual Studio都需要完整的构建,那么我会检查VS使用的条件来确定需要构建的内容。 我知道在检查需要构建的内容时,VS会检查所有输入文件的时间戳。 我已经看到了链接生成的文件导致所有下游依赖项每次都构建的情况,即使生成的文件的内容相同。 这是MSDN增量构建的链接。

http://msdn.microsoft.com/en-us/library/ms171483.aspx

我不确定VS是否还有其他条件来识别需要构建的项目。