Visual Studio重build未修改的项目

所以,正如标题所示,我现在有一个VS2010解决scheme,里面有大约50个项目。 如果我改变了一个没有任何引用的“顶级”项目,VS仍然重build所有50个项目。 我正在运行Visual Studio 2010 Ultimate,没有任何附加组件。 我正在使用ILMerge将所有项目合并到一个文件中。

我已经通过检查低级DLL的时间戳validation了这一点,并且看到它们确实被重build,即使它们的代码没有被触摸。

我已阅读所有回复和评论:

Visual Studio 2008不断重build

Visual Studio不断构build一切

在我的解决scheme中发生奇怪的VS2010生成故障

在Visual Studio中重buildC#项目的原因

但他们大多只是提出卸载项目的build议,以加快构build时间,但没有具体的解决办法。 我试图找出为什么VS认为这些依赖项目需要重build时,他们不和解决它。

我打开了“工具”>“选项”>“项目和解决scheme”>“构build和运行”>“仅运行构build启动项目和依赖关系”,但没有任何效果。

另外,如果我只重build一个只有8个(直接)依赖关系的“中级”项目,那么即使ILMerge没有被调用,也没有任何依赖项目被修改,它仍然会build立所有8个项目。

感谢大家的任何洞察力,你可能能够提供。

添加

为了testing一些build议,我从头创build了一个新的WinForms项目。 然后,我在该解决scheme中创build了两个新项目。 我从我的两个“最低级别”项目中将所有的代码和资源(不是项目文件)复制到两个全新的项目中(我通过将文件和文件夹从资源pipe理器中删除到Visual Studio中的项目上)。

最低的项目,我们称之为B ,没有引用任何其他项目。 下一个项目A只参考B. 所以一旦我将所需的.NET和外部程序集引用添加到项目中,那么解决scheme就会生成。

然后,我有我的新的WinForm项目参考A ,并做了一个完整的构build。 所以参考链是:

WinForm – > A – > B

然后,我修改了WinForm并做了一个标准的构build(F6)。 和以前一样,Visual Studio重build了所有三个项目。

在项目B中对源文件进行了一些系统化的布局之后,我发现如果我删除了Resources.Designer.csResources.resx (并且注释了使用这些资源的.Properties.Resources对象的代码),那么修改WinForm将不再重build整个解决scheme,只会重buildWinForm

Resources.resxResources.Designer.cs添加回项目B (但将引用的代码注释掉,以避免使用资源)将重新引入完整的构build行为。

为了查看我的资源文件是否损坏,我再次删除它们,然后创build一个新的(通过项目属性 – >资源),并重新添加与之前相同的资源,这是一个单独的Excel文件。 有了这个设置,完全重build仍然会发生。

然后我删除了单个资源,但将资源文件留在项目B中 。 即使没有添加资源,但资源文件仍在项目中,将会发生完全(不需要的)重build。

看起来只是将一个资源文件添加到(.NET 3.5)项目将导致Visual Studio 2010始终重build该项目。 这是一个错误或预期/预期的行为?

再次感谢所有!

打开工具 – 选项,select项目和解决scheme – 在树中生成并运行,然后将“MSBuild项目生成输出详细”设置为诊断。 这将输出build立一个项目的原因,即

项目“ReferencedProject”不是最新的。 项目“c:\ some.xml”具有“复制到输出目录”属性设置为“始终复制”。

项目“MyProject”不是最新的。 在输出文件“c:\ MyProject.pdb”后修改input文件“c:\ ReferencedProject.dll”。

在这种情况下,解决方法是仅在更新的情况下复制some.xml。

构build前和构build后事件也可以触发构build。

虽然我不认为这是一个修复,这是一个解决方法已经适用于我的情况…

我最初有50个项目中有5个项目包含了Resources部分。 这些项目总是会被重build,因此任何他们所依赖的东西也会被重build。 其中的5个项目之一是其他项目中的48个被引用的“基础”级库,因此即使不需要它,我的项目也会每次重build96%。

我的解决方法是使用dependency injection,接口和专用的“资源”项目。 而不是让这5个项目引用自己的Resources对象,我在每个项目中创build一个接口,提供所需的资源。 然后,需要这些资源的类将需要在构造函数(构造函数注入)中创build时传入接口。

然后我创build了一个单独的“资源”项目,其中有一个像普通的实际的资源部分。 这个项目只包含资源本身,并且每个接口的类都需要通过接口提供这些资源。 这个项目会引用每一个有资源依赖的项目,并实现项目所需的接口。

最后,在我没有任何引用的“顶级”项目(以及实际构build的EXE和我的组合根目录)中,我引用了“资源”项目,连接了DI,然后离开了。

这意味着每次只重build两个项目(“资源”和“顶层”),如果我进行部分构build(Shift-F6),则根本不会进行重build。

再次,不是一个伟大的工作,但有48个项目正在build设每一个build设将需要约3分钟,所以我每天失去30至90分钟,不必要的重build。 花了一段时间来重构,但我认为这是一个很好的投资。

这是一个简化的图。 请注意,从Main.exeMain.exeProj2的依赖关系未显示,以减less混乱。

解决方案的图解

有了这个devise,我可以在不触发完全重build的情况下构buildProj1Proj2 ,因为它们对“ Resources部分没有任何依赖关系。 只有Main知道Resources实施。

当一个项目有一个不存在的文件时会发生这种情况。
该项目不能确定文件是否被更改(因为它不在那里),所以它重build。

只需查看项目中的所有文件,然后search附近没有可扩展箭头的文件。

我在VS 2015有同样的问题。

对我来说有什么窍门是:

  1. 一个项目引用自己在其他项目斌(魔术,是)复制。 当切换到诊断构build输出(在构build选项中),然后尝试从项目层次结构的顶部逐个构build项目时,可以find这种东西 – 如果您看到即使没有任何变化也可以重build的项目,引用。
  2. 我已经将所有项目中的所有“复制总是”文件更改为“复制如果更新”。 基本上,在所有.csproj文件中,将<CopyToOutputDirectory>Always</CopyToOutputDirectory>replace为<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  3. 然后我使用这个PowerShell脚本禁用NTFS隧道,如本文所述:

New-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control\FileSystem" -Name "MaximumTunnelEntries" -Value 0 -PropertyType "DWord"

之后,我需要重build,似乎现在工作。

在我的情况下,罪魁祸首是引用的dll设置为“复制本地”设置为true和“复制到输出目录”设置文件设置为始终复制。

这里是从VS2010总是重build解决scheme的答案?

这个问题是通过更改项目文件,清理解决scheme,手工删除所有bin文件夹,重新启动Visual Studio并重build所有内容来解决的。

根据你的观察,这听起来像你有项目expression依赖到其他项目的方式不明显。 孤立的依赖关系可能会保留在项目文件中,而不会在UI中显现出来。 在文本编辑器中打开它之后,你是否浏览了一个行为不当的项目文件? 检查解决scheme构build依赖关系?

如果您无法find任何东西,请尝试从头开始重新创build一个项目,以查看新项目是否出现同样的问题。 如果干净的项目build立正确,你会知道你有不需要的依赖expression的地方。 据我所知,这些将不得不在项目文件或解决scheme文件,除非你有makefile或其他不寻常的构build步骤。

我和你有同样的问题。 我发现它来自一些被删除的文件。 当我从我的项目中删除文件时,问题就没有了。 问候。

对于这种types的构build问题,将MSBuild输出冗长设置为“诊断”确实是必要的第一步。 大多数情况下,重新构build的陈述原因就足以采取行动,但偶尔MSBuild会错误地声称某些文件被修改并需要被复制。

如果是这种情况,您需要禁用NTFS隧道或将您的输出文件夹复制到新的位置。 这里用更多的话来说。

经常发生的另一个问题是,当您的解决scheme中的某个项目有未来修改的邮票时。 如果您向前设置时钟,则可能会发生这种情况,然后将时钟设置为正确的时间。 安装Linux时发生了这种情况。

在这种情况下,您可以recursion地使用git bash(是的,在Windows中)触摸所有文件:

 find . -exec touch {} \; 

MSBuild团队正在收集有关调查构build增量问题的文档: https : //github.com/Microsoft/MSBuild/wiki/Rebuilding%20when%20nothing%20changed