在Visual Studio中,Build Solution、Rebuild Solution和Clean Solution的区别是什么?

1313

在Visual Studio中,“生成解决方案(Build Solution)”,“重新生成解决方案(Rebuild Solution)”和“清理解决方案(Clean Solution)”有何不同?

何时应该使用每个方法?


6
另请参见https://dev59.com/m3M_5IYBdhLWcg3wvV5w。 - Greg
4
重建和先清除再构建是一样的吗? - Colonel Panic
2
@ColonelPanic 是的 - Alan Birtles
15个回答

1107
  • 生成解决方案会执行增量构建:如果它不认为需要重新构建项目,它就不会这样做。如果未更改项目的部分构建文件,它还可以使用这些文件(我不知道它处理到了什么程度)。
  • 重新生成解决方案将从头开始清理并构建解决方案,忽略之前所有的构建过程。与“清理后再构建”的区别在于,重新生成将逐个清理和构建每个项目,而不是先全部清理再全部构建。
  • 清理解决方案将删除上一次构建生成的文件。如果目标文件夹(bin 和 obj)中还有其他文件,则可能不会被删除,但实际的构建生成文件会被删除。我曾经看到这种情况的行为不同——有时候删除得相当彻底,有时候则不一定。但现在我给VS一个机会:

(这些链接指向devenv.exe命令行开关,但它们与菜单项执行的操作相同。)


3
不在我刚查看的项目中。它仍然保留着所有的组件…… - Jon Skeet
196
我个人发现“Clean Solution”毫无帮助。如果我真的想要干净,手动删除bin和obj文件夹是最好的方法。甚至被迫追踪幽灵“错误”- 直到我这样做了。清理只是不可靠的。 - Chris Rogers
11
如果艺术品通过除了生成构件的其他方式传递(例如从另一个来源复制并作为msbuidltask集成到cproj中),那么clean命令会保留它们。这使得该命令几乎无用,甚至可以说是危险的,因为它会让您产生错误的清理效果的错觉。 - Newtopian
3
我曾经注意到,在重新构建导致链接错误时,使用“清理+构建”可以解决问题。 - happygilmore
6
针对GitHub等平台,最简单的做法是使用一个不错的.gitignore文件。但根据回答,在我个人的经验中,Clean并不总是做得特别彻底。 - Jon Skeet
显示剩余9条评论

526

构建解决方案:编译更改的代码文件(DLL和EXE)。

重新生成:删除所有已编译的文件,并再次编译它们,无论代码是否已更改。

清理解决方案:删除所有已编译的文件(DLL和EXE文件)。

您可以观看这个YouTube视频(Visual Studio Build vs. Rebuild vs. Clean (C# interview questions with answers)),在视频中我演示了它们之间的差异。下面是可视化表示,可以帮助您更详细地分析。

Build vs Rebuild

重建与(清理+构建)之间的区别,因为这方面也存在一些混淆:

区别在于每个项目的构建和清理顺序。假设您的解决方案有两个项目,“proj1”和“proj2”。如果您进行重建,则会对“proj1”进行清理(删除)“proj1”的已编译文件并进行编译。然后,它将采取第二个项目“proj2”,清除“proj2”的已编译文件并编译“proj2”。

但是,如果您执行“清理和构建”,它将首先删除“proj1”和“proj2”的所有已编译文件,然后先构建“proj1”,然后是“proj2”。

Rebuild Vs Clean


156

以下内容来自此链接

编译(Build)是仅编译和链接上次编译以来有更改的源文件,而重新构建(Rebuild) 是编译和链接所有源文件,无论它们是否发生更改。通常情况下,编译是正常操作,速度更快。有时,项目目标组件的版本可能会不同步,需要重新构建才能使编译成功。实际上,您永远不需要清理。


2
链接?我认为 DLL(动态链接库)的想法是在运行时链接? - The Dag
21
在实践中,你永远不需要清理 <-- 我对此表示怀疑。 - piers7
3
能否提供您需要清洁而不是重建的原因? - PaulBinder
4
不用找得太远。 - JakeD

60

构建解决方案 - 构建任何有更改的程序集。如果一个程序集没有更改,它将不会被重新构建。也不会删除任何中间文件。

最常用的选项之一。

重新生成解决方案 - 无论是否有更改都会重建所有程序集,但是不会删除中间文件。

在你注意到Visual Studio没有将最新更改纳入程序集中时使用。有时Visual Studio会出错。

清理解决方案 - 删除所有中间文件。

当其他方法都失败并且你需要清除所有内容重新开始时使用。


什么是中间文件?你是指Dll、pdb和xml文件吗? - Mr.Shark
2
当你注意到Visual Studio没有在最新的程序集中合并你的更改时使用。有时候Visual Studio会犯错误。这就是我点赞这个答案的原因,因为其他答案似乎没有提到它。 - Ooker

20

我认为重建(Rebuild)是先进行清理操作,然后再进行构建操作。也许我错了……有什么意见吗?


1
这个问题之前没有任何赞同(直到现在),根据文档(请参见Jon答案中的链接)这是完全正确的。 - Tod
2
我认为它不会。我的情况是,先进行“清理解决方案”,然后进行“生成解决方案”可以工作,但进行“重新生成解决方案”会失败。这是在一个新创建的解决方案中,其中包含2个项目(其中一个是另一个项目的依赖项)。 - Cthutu
@Cthutu,请参考Shivprasad的答案,了解其中的差异。Rebuild会逐个清理并编译每个项目,而先运行Clean会一次性清理所有内容,然后再一次性构建所有内容。我遇到过这种情况,改变清理/构建的顺序会影响是否能够编译成功。 - Sean
@Sean 或许是因为在你的解决方案中将一个项目添加为“文件引用”而不是“项目引用”,导致项目构建顺序无法识别需要在另一个项目之前构建某个特定项目,从而在构建期间该程序集不存在于应有的位置? - Zack

8

生成解决方案将构建已更改的所有项目。重新生成将构建所有项目,而不管是否更改。清理解决方案将删除所有临时文件,确保下一次构建完整。


7
我认为人们遗漏的一个重点是,Build和Clean都是基于Visual Studio对项目/解决方案的了解而执行的任务。我看到很多人抱怨Clean不起作用、留下垃圾文件或者不可靠,但实际上,你所说的它不可信的原因,反而使它更加可信。
Clean只会删除(清理)Visual Studio或编译器自己创建的文件和/或目录。如果你复制自己的文件或从外部工具或源创建文件/文件夹结构,则Visual Studio不会“知道它们的存在”,因此不应该触及它们。
想象一下,如果Clean操作基本上执行“del *.*”?这可能是灾难性的。
Build对已更改或必要的项目进行编译。
Rebuild无论是否更改或必要都执行编译。
Clean删除它过去创建的文件/文件夹,但保留任何它最初没有关联的内容。
希望这有点详细,并且有所帮助。

Clean会删除过去创建的文件/文件夹,但会保留一开始没有关联的任何内容。这基本上是正确的,但并非完全如此。对于中间文件,是的,它会精确地删除工具链生成的文件集。对于其他文件,在构建输出目录中,它使用通配符模式,例如*.pdb。这会导致在Rebuild Solution中出现竞争条件,如果您先执行Clean Solution,然后再执行Build Solution,则不会出现这种情况。 - Adrian McCarthy

6

构建解决方案 - 构建解决方案将构建应用程序,仅构建已更改文件的项目数量。它不清除任何现有的二进制文件,只是在bin或obj文件夹中替换更新的程序集。

重新构建解决方案 - 重新构建解决方案将构建整个应用程序,并构建解决方案中所有可用的项目并清理它们。在构建之前,它会清除bin和obj文件夹中的所有二进制文件。

清理解决方案 - 清理解决方案只是清除bin和obj文件夹中的所有二进制文件。


6

我有一个空白解决方案 BuildRebuildClean 和三个类库 Models,Repository,Notification.

我在 Notification 类库中使用了 ModelsRepository

然后:

  • 构建解决方案增量构建并仅编译更改的文件。如果程序集没有更改,则不会重新构建。它也不会删除任何中间文件。 如果在 Models 库项目中修改代码,然后构建解决方案。在下面的屏幕截图中,参考 DLL 的时间戳,EXE 在 ModelsNotification 库中更新。

enter image description here

  • 重建解决方案会删除所有已编译的文件,无论是否更改,并忽略之前所做的任何工作。 右键单击解决方案名称BuildRebuildClean。它会删除所有程序集、EXE和引用的文件以便重新编译。

enter image description here

  • 清理解决方案 从bin/obj目录中删除所有已编译的、中间的文件(即EXE和DLL)。

enter image description here


3
这是一个两部分的问题,但除了Justin Niessner之外的所有答案都只关注第一部分:区别。我认为更有趣的是第二部分:“何时使用它们中的每一个是适当的?”让我先说说我对每个命令的理解:
Build:应该并通常会生成(构建)与其源文件不一致的每个中间和输出文件。
Rebuild:一种解决方案(hack),允许您在由于过时评估错误而导致构建命令失败时进行构建。
Clean:删除生成的(中间和输出)文件的hacky实现,以便随后的构建可能起作用。hacky因为它经常没有删除足够的文件。VS设计师将所有中间和输出文件放在单独的目录中。为什么不删除这些目录?!?!但是,我偏离了主题。
没有明确的方法可以知道何时使用一个命令而不是另一个命令。了解每个命令的操作并不能真正告诉我何时使用每个命令。
这更多地涉及个性而不是科学。乐观主义者大多数情况下使用Build,但如果Build失败并且他们认为问题是Visual Studio的反常行为,则会使用Rebuild。如果Rebuild失败,那么他们就会执行Clean和Build。当这也失败时,他们开始搜索...
更悲观的人总是使用Rebuild,因为它更可靠,即使每次使用时需要更长时间。最悲观的人总是先清理再重建。他们忘记了有一个Build命令。他们还系着皮带和吊带裤。
有些人可能认为这很愤世嫉俗。但我不这么认为。我认为Visual Studio的用户体验很糟糕,而用户和行业已经习惯了它。更糟糕的是,许多其他工具采用了相同的用户体验,因为VS是无处不在的。
在我看来,微软应该:修复Build、修复Clean并消除Rebuild。

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