在Visual Studio中,Rebuild和Clean+Build之间有什么区别?

325

重建和在Visual Studio 2008中执行清理+构建的区别是什么?清理+构建与执行清理+重建不同吗?

7个回答

323

重建 = 清理 + 构建 (通常如此)

需要注意的细节:

  1. 对于多项目解决方案,“重建解决方案”会针对每个项目执行“清理”操作,然后再编译(可能并行进行)。而“清理解决方案”后跟“构建解决方案”则首先清理所有项目(可能并行进行),然后再编译所有项目(可能并行进行)。当涉及到项目间依赖关系时,这些事件序列的差异可能变得非常重要。

  2. 所有三个动作都对应于 MSBuild 目标。因此,一个项目可以覆盖重建操作以执行完全不同的操作。


2
那么你的意思是说RebuildClean加上Build完全一样?这正是我所想,但我不确定。 - Jim McKeeth
45
除了“Rebuild”会先清理再逐个重建项目外,“Clean+Build”会先清理所有项目,然后一次性重新构建它们。这两者的区别在于,如果您误点击了Clean+Build,它将需要更长时间来完成。 - Eugene
27
除了没有保证它们是相同的之外,参见下面JaredPar的答案,结合Earl的答案可以得到完整的图片。由于Rebuild会逐个处理每个项目,所以当您的依赖信息混乱时,可能会出现“特殊情况”,即使用旧项目A构建B的顺序不正确,然后重新构建A,再重新构建C等。全面的解决方案是首先执行Clean操作,然后再进行全面的Build操作,这样就可以检测出这种情况,而使用Rebuild则无法做到。因此,如果您更加谨慎和疲劳,您会更倾向于选择先Clean再Build。 - Jason Harrison
18
这并不是真的。我有一个项目,在执行“清理+构建”操作成功后,重新构建时返回了编译错误(存在循环文件引用)。因此它们并非完全相同。 - Yaakov Ellis
2
或许自这篇文章发表以来情况已经有所改变,但是有一个原因解释了为什么 Rebuild 不再等同于 clean + build。https://dev59.com/eXA75IYBdhLWcg3wy8fr - Dave
显示剩余3条评论

169

Earl说99%的情况下重构=清除+构建。

但是它们不能保证完全相同。这3个动作(重新构建、构建、清除)代表不同的MSBuild目标。每个项目文件都可以覆盖这些目标,以执行自定义动作。因此,完全有可能某人覆盖重构以在启动清除+构建之前执行多个操作(或完全删除它们)。

这只是一个小概率情况,但由于评论讨论,需要指出。


1
如果您添加了将.dll文件移动到新位置的构建操作,则仅进行重新构建可能会导致“错误”的构建结果。如果混合使用vb.net和c#项目,则情况会变得更糟,窗体设计师崩溃,goto无法正常工作。 - CodingBarfield
请注意,重新构建行为似乎在不同语言之间的依赖关系方面并不一致:https://dev59.com/Q2fWa4cB1Zd3GeqPkcpe。 - lesscode
4
99%的时间被高估了。 - Rhyous

65
让我们根据默认的Clean和Build实现来定义默认的Rebuild实现:
  1. 每个项目:Rebuild项目=清理项目+构建项目。

  2. 每个解决方案:Rebuild sln = 对于sln中的每个项目(清理项目+构建项目)。

请注意,由于执行顺序的差异,Rebuild sln并不等同于(Clean sln + Build sln)=(对于sln中的每个项目Clean项目)+(对于sln中的每个项目Build项目)。另外,“foreach”可能会并发执行,因此在两种情况下允许运行不同的任务。

假设您有一个包含proj1、proj2和proj3的sln。

  • Rebuild sln=(清理proj1+构建proj1)&(清理proj2+构建proj2)&(清理proj3+构建proj3)

  • Clean Sln + Build Sln=(清理proj1&清理proj2&清理proj3)+(构建proj1&构建proj2&构建proj3)

+表示串行,&表示并发。

因此,如果项目依赖关系未正确配置,则在执行Rebuild sln时,某些项目链接到过时的库的可能性很大。这是因为所有清理都不能保证在第一次构建开始之前完成。如果执行Clean sln + Build sln,它们将会给出链接错误并立即让您知道,而不是给您一个具有奇怪行为的应用程序。


8
这是最准确的答案,因为它解释了为什么有时我无法重建,但可以进行清理+构建。 - Toan Nguyen

11

来自http://www.cs.tufts.edu/r/graphics/resources/vs_getting_started/vs_getting_started.htm,(刚才通过谷歌搜索获得):

Build 是编译并链接仅在上次构建后发生更改的源文件,而 Rebuild 是编译和链接所有源文件,无论它们是否发生了更改。通常使用 Build 并且速度更快。有时,项目目标组件的版本可能不同步,需要重新构建以使构建成功。实际上,您从不需要清理。

构建或重建解决方案将构建或重建解决方案中的所有项目,而构建或重建仅会构建或重建启动项目,在上面的屏幕截图中为“hello”。要设置启动项目,请右键单击“解决方案资源管理器”选项卡中所需的项目名称,然后选择“设置为启动项目”。项目名称现在显示为加粗。由于作业解决方案通常只有一个项目,因此构建或重建解决方案实际上与构建或重建相同。

编译只会编译当前正在编辑的源文件。当其余源文件处于无法成功构建整个项目的不完整状态时,可以用于快速检查错误。Ctrl-F7 是编译的快捷键。


1
就像Toan Nguyen一样,我也经历过有时候清理+构建解决方案可以成功,而重新构建解决方案会失败的情况(可能是由于项目间依赖关系),因此这个答案至少在2018年是误导性的。 - Jon Coombs

4
这篇博客文章中,作者在这个问题的评论中提到了这一点:
“实际上并不相等。区别在于项目清理和构建的顺序。假设我们有两个项目在一个解决方案中。使用清理和构建将对两个项目进行清理,然后单独进行构建;而在重新构建时,项目A将被清理并构建,然后是项目B的清理和构建,以此类推。”

1
Visual Studio 2022的文档解释如下:
  • 选择BuildBuild Solution,或按Ctrl+Shift+B,只编译自最近构建以来发生更改的项目文件和组件。当一个解决方案包含多个项目时,Build命令将变为Build Solution。
  • 选择Rebuild Solution来“清理”解决方案,然后构建所有项目文件和组件。
  • 选择Clean Solution来删除任何中间文件和输出文件。只留下项目和组件文件,可以构建中间文件和输出文件的新实例。

build-configuration-manager-menu

更多信息,请参见:https://learn.microsoft.com/en-us/visualstudio/ide/building-and-cleaning-projects-and-solutions-in-visual-studio?view=vs-2022


0
另一个区别是:Clean会清除测试资源管理器中的测试结果,而Rebuild则不会。

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