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

23
我在Visual Studio 2010中有一个包含多个项目的.NET解决方案。最近,当我从IDE内运行启动项目时,只有在启动项目或其中一个依赖项目的代码发生更改时,才会构建这些项目。
大约两周前,我注意到每次运行启动项目时,Visual Studio都会构建所有项目,大约需要七分钟的时间。不用说,这占去了我很多时间,我已经尽力在网上寻找解决方案,但尚未找到解决特定问题的任何解决方案。
还有一些额外的信息-与我同时期,我的团队中其他人也遇到了同样的问题。
我们还使用源代码库。由于我们没有更改Visual Studio的任何设置,因此我的怀疑是某人无意中更改了某个项目的源代码,现在需要每次构建所有项目。
如果您有任何建议,将不胜感激。

2
只是好奇,你是如何“运行”你的代码的? - Pseudonym
1
你的项目中有任何一个设置为“注册COM互操作”吗?这就是我的问题所在。 - C-Pound Guru
1
构建输出是否提供了任何线索,表明您的项目的哪个最早依赖项始终过时?您是否已经查看了项目文件的修改历史记录? - Jason Kleban
你们的团队现在使用什么“源代码存储库”? - rskar
2
你已经知道应该看什么了。只有在你发布msbuild跟踪之后,才能得到可靠的答案。 - Hans Passant
显示剩余4条评论
15个回答

18

可能的原因有很多,如果没有你的解决方案和项目,我们只能猜测。

我通常处理这个问题的方式是通过二分查找来缩小范围。也就是说,

  1. 我构建所有项目。
  2. 然后我在构建顺序中找到中间的某个项目并构建它。如果该项目所依赖的东西是罪魁祸首,那么你会遇到问题。如果它不依赖于任何问题,你就不会遇到问题(例如:它会说所有项目都被跳过)。
  3. 现在,您可以重复此过程,直到缩小到(希望)导致问题的项目。

当然,这仅适用于引入新问题的单个项目(这很可能是情况)。

在我的具体情况中,其中一个罪魁祸首是将 x64 项目引用了一个未在 x64 配置中选择构建的 x86 项目。


我将按照这些步骤进行,并很快会回到您那里,告诉您结果。谢谢。 - Chris
7
FYI - 这些步骤帮助我找到了问题的根源。我的团队中有人无意中通过在解决方案中引用项目的二进制版本创建了一个循环引用,因此该二进制版本始终比新编译的版本稍旧。移除引用解决了这个问题,因为引用并不是必需的。感谢您的帮助! - Chris

12

我将在这里分享我在stackoverflow上找到的最佳答案,并结合Matt Smith在此处接受的答案,我已经找到了我的问题的根本原因:

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

因此,假设您在一个解决方案中有3个项目:

  • Library0
  • Library1
  • Application

这样引用:应用程序引用Library1,而这个项目引用Library0。选择“生成”应用程序项目时,第一次它应该按顺序构建所有引用的项目。但是,从现在开始,如果没有进行任何更改,按下“生成”按钮不应该构建任何东西,因为MSBuild检测到没有进行更改。类似的日志输出应该显示:

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

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

Project 'Library0' is not up to date. Input file 'c:\Library0\Class1.cs' is modified after output file 'c:\Library0\bin\Debug\Library0.pdb'.


5

进入“工具”菜单->“选项”->“项目和解决方案”->“生成和运行”。

查看这里的选项。应该勾选“只在运行时构建启动项目和依赖项”。

此外,您还可以将构建输出(在同一选项屏幕上)设置为详细或诊断,以查看是否可以找到任何线索,为什么每次都要构建项目。


感谢您的回复。我们之前尝试过您提出的第一个建议,因为这似乎是在线上常见的解决方案,但是那并没有帮助我们,而且在我看来,如果我们一开始就没有更改构建设置,我们就不应该修改 Visual Studio 中的构建设置。这有道理吗?关于您的第二个建议,我会尝试一下。我之前将其更改为诊断模式,但在构建输出中没有看到任何有用的信息,但我会尝试将其更改为详细模式。 - Chris
很抱歉,您的建议未能解决我的问题。 - Chris

4

根据我的经验,只有部分项目需要重新构建,而且在多次失败后才最终成功。这显然是由于\rootprojectdir\.vs\%projectname%\v14\.suo文件损坏所致。这也导致相同的项目需要重新构建,并且每次打开VS时都要打开相同的窗口。关闭VS并删除.suo文件,重新打开VS即可解决问题 :)


2

.csproj中的TargetFramework与app.config中的supportedRuntime-sku

我发现了另一个导致重建的原因(至少在新的sdk-style项目文件中,没有尝试过旧式项目):如果.csproj文件中的元素与app.config中条目的sku属性不匹配,则Visual Studio也会每次都重新构建项目。

例如,在.csproj中以4.6.2为目标:

<TargetFramework>net462</TargetFramework>

那么在app.config中应该这样写:

<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.2"/>

这样可以避免不必要的重建。

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net462</TargetFramework>
  </PropertyGroup>
</Project>

vs. 4.6.1 specified in app.config

<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1"/>
    </startup>
</configuration>

最初的回答会触发重新构建。

2

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

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

(在我的情况下,是一个.ico文件意外地被设置为构建操作:资源复制到输出目录:仅在更改时复制。非常难找。)


你知道一直保持“诊断”设置是否有任何不利影响吗?这会导致构建变慢吗? - Emil
它可能会慢一点,但差别非常小,从未被注意到。例如在一个有大约50个项目的解决方案中,可能只有一两秒钟的差距。 - HiredMind
创建一个VS插件会让这变得更简单,这很有趣。哎呀,我真的很想念CodeWarrior。 - ATL_DEV

2

对于SDK样式的项目,现在还有“项目和解决方案” -> “SDK样式项目” -> “日志记录级别”。在调试增量构建时,将其设置为“详细信息”。

在我的情况下,由于AutoGenerateBindingRedirects,期望有一个.dll.config,但没有找到。这导致增量构建失败。最终发现是Visual Studio中的一个错误,通过删除一些与项目相关的缓存文件来解决。


2

我来这里是为了解决自己的问题,但所提供的答案都没有解决我的问题。

经过调查,我发现在xaml文件的Copy to Output Directory属性值设置为Copy alwaysCopy if newer时,UWP项目每次都会被编译。过去,这可以帮助解决一些编译问题,但自从xbf引入后,即使没有更改任何源代码,这些文件上的这些值也会强制Visual Studio每次重新编译。

我写了一篇博客文章介绍此问题:Preventing Visual Studio Recompiles in UWP

希望能对某人有所帮助。


1
我遇到了一个独特的情况,其中一些源文件来自未来。我需要测试一些代码,改变系统时间并修改未来日期的代码。然后,当我切换回现在时,这些文件会导致项目在每次运行时重新构建。解决方案很简单,创建一个新文件,并将那些修改过的文件内容复制到其中。

就是这样了!谢谢! - undefined

1
如果Visual Studio每次都需要进行完整构建,首先应该检查设置(已经提到),然后检查VS用于识别需要构建的条件。我知道VS在检查需要构建的内容时会检查所有输入文件的时间戳。我曾经看到过一个链接生成的文件导致所有下游依赖项每次都需要构建的情况,即使生成文件的内容相同。这是MSDN增量构建的链接。

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

我不确定 Visual Studio 是否使用其他条件来识别需要构建的项目。

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