Visual Studio中的构建解决方案,重建解决方案和清理解决方案之间的区别?


Answers:


921
  • 构建解决方案将执行增量构建:如果它认为不需要重建项目,则不需要。如果未更改,它也可能会使用项目的部分构建的位(我不知道需要花多长时间)
  • 重建解决方案将清除,然后从头开始构建解决方案,而无需理会之前所做的任何事情。这与“先清理,再生成”的区别是,“重建”将一次清理然后生成每个项目,而不是先清理然后再编译。
  • 干净的解决方案将从先前的构建中删除构建工件。如果构建目标目录(bin和obj)中还有其他文件,则可能不会将其删除,但实际的构建工件会被移除。我见过这种情况的行为有所不同-有时会彻底删除,有时则不会-但是我暂时会给VS带来疑问的好处:)

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


2
@womp:不在我刚刚看过的项目中。它仍然在那里有所有的集会...
Jon Skeet 2010年

1
@Jon-很奇怪 我不记得从未清理过这些目录。我正在执行此操作,并且正在擦除所有.dll和.pdb文件。绝对不要管我的ReSharper垃圾。
womp 2010年

156
我个人发现“清洁解决方案”无济于事。如果我真的希望它干净,手动删除bin和obj文件夹是解决方法。甚至在追逐幻影“错误”时被抓到-直到我做到了。清洁不可靠。
克里斯·罗杰斯

7
如果工件通过构建工件而不是通过其他方式(例如,来自另一个来源的副本作为cproj中的msbuidltask集成)进行了处理,则清除后将保留它们。这使它几乎毫无用处,我什至会说这很危险,因为它会给您带来虚假的清洁感。
Newtopian 2012年

4
@verdana:对于github等,拥有一个像样的.gitignore文件更简单。但是根据答案,根据我的经验,Clean并不总是做得特别彻底。
乔恩·斯基特

455

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

重建:删除所有编译的文件,然后再次编译它们,而不管代码是否更改。

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

您可以观看此YouTube视频(Visual Studio Build vs. Rebuild vs. Clean(带有答案的C#面试问题)),其中我演示了这些区别,下面是直观的表示形式,可以帮助您更详细地分析它们。

构建与重建

Rebuild与(Clean + Build)之间的区别,因为围绕此似乎也有些混乱:

不同之处在于每个项目的生成和清理顺序发生的方式。假设您的解决方案有两个项目,“ proj1”和“ proj2”。如果您进行重建,它将花费“ proj1”,清理(删除)“ proj1”的编译文件并进行构建。之后,将使用第二个项目“ proj2”,清除“ proj2”的已编译文件并编译“ proj2”。

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

重建与清洁


26
感谢您解释为什么Rebuild并不总是有效,并且我经常需要在进行构建之前进行清理。
Didier A.

4
是的,说明和第二张图非常有用且清晰。如果您可以解决“非法”流程图,以便将“是”仅放在一个位置,那将会有所帮助。我真的听不懂他想说什么,尤其是在“重建”下的“全部构建”下。
乔恩·库姆斯

@JonCoombs是的,我认为第一个流程图无法准确地捕捉到他在视频中所说的内容。我认为我插入的图像正是Shivprasad的目标。
ruffin

据我了解,如果任何文件已更改,则将在常规构建中清理项目,这意味着它将不执行任何操作或将清理然后生成项目。它是否正确?
清晰的

147

取自此链接

Build表示仅编译和链接自上次编译以来已更改的源文件,而Rebuild表示仅编译和链接所有源文件,无论它们是否已更改。构建是正常的事情,并且更快。有时项目目标组件的版本可能会不同步,因此必须进行重建才能使构建成功。实际上,您不需要清洁。



1
链接?我认为DLL(也称为动态链接库)的想法是在运行时链接?
达格

7
“实际上,您永远不需要清洁” <-我称这为BS。
7

2
piers7您能提供一个需要清理还是重建的理由吗?
PaulBinder '16


46

生成解决方案 - 生成所有已更改文件的程序集。如果装配体没有变化,则不会重建。也不会删除任何中间文件。

最常用。

重建解决方案 -重建所有程序集,无论更改如何,但保留中间文件。

当您注意到Visual Studio没有将所做的更改合并到最新程序集中时使用。有时Visual Studio确实会犯错误。

干净的解决方案 -删除所有中间文件。

当所有其他方法都失败并且需要清理一切并重新开始时使用。


25
清洁不会建立。
乔恩·斯基特

3
@Jon Skeet-每天学习新东西。我会发誓要重建。我想我的记忆并不总是如我所愿。
贾斯汀·涅斯纳

16

我只是认为Rebuild是先执行Clean,然后是Build。也许我错了...评论?


这没有投票(直到现在),根据文档(请参阅Jon的答案中的链接),这是完全正确的。
Tod 2012年

2
我不这样认为。我遇到的情况是先执行“清洁解决方案”,然后执行“构建解决方案”,但是执行“重建解决方案”失败。这是一个新创建的解决方案,包含2个项目(一个依赖于另一个)。
Cthutu

@Cthutu有关在此处有所作为的细节,请参见Shivprasad的答案。重建清理一次,然后一次生成每个项目,而运行清理首先清理所有内容,然后构建一次生成所有内容。我遇到过一些实例,在这些实例中,清理/构建顺序的这种变化也使编译和不编译之间有所不同。
肖恩

@Sean可能是由于在解决方案中添加了一个项目file reference而不是一个项目,project reference因此项目构建顺序不认识到它必须先构建某个项目,并且在安装过程中程序集不存在于应有的位置建立?
扎克2015年

14

生成解决方案生成所有已更改文件的程序集。如果装配体没有变化,则不会重建。也不会删除任何中间文件。

重建解决方案将清理,然后从头开始构建解决方案,而无需理会之前所做的任何事情

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


8

构建解决方案将构建解决方案中所有已更改的项目。无论如何,重建都会生成所有项目,干净的解决方案会删除所有临时文件,以确保下一个生成完成。


6

构建解决方案 -构建解决方案将通过构建许多文件更改的项目来构建您的应用程序。并且它不会清除任何现有的二进制文件,而只是替换bin或obj文件夹中的更新程序集。

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

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


5

建立解决方案

这将执行增量构建。换句话说,它将仅构建已更改的代码文件。如果它们没有更改,则这些文件将不会被触摸。

重建解决方案

这将删除所有当前编译的文件(即exe和DLL),并将从头开始构建所有内容,而不管文件中是否存在代码更改。

清洁溶液菜单

该菜单将从bin / obj目录中删除所有已编译的文件(即EXE和DLL)。

重建=清洁+构建


4

我认为人们遗漏的一件事是构建和清理都是基于Visual Studio对项目/解决方案的了解而执行的任务。我看到很多抱怨,Clean无法正常工作或留下剩余文件或不可信,实际上,实际上,您说它不可信的原因实际上使其变得更可信。

清除只会删除(清除)Visual Studio或编译器本身实际上创建的文件和/或目录。如果您复制自己的文件或从外部工具或源创建的文件/文件夹结构,则Visual Studio不会“知道它们存在”,因此,请勿触摸它们。

您能想象清理操作是否基本上执行了“ del *。*”?这可能是灾难性的。

Build对更改或必要的项目执行编译。

无论是否有更改或需要什么,Rebuild都会执行编译。

Clean会删除过去创建的文件/文件夹,但最初会保留所有与它无关的内容。

我希望这能对您有所帮助。


4

我有AA空白溶液BuildRebuildClean和三个类库ModelsRepositoryNotification

我在类库中使用Models和。RepositoryNotification

然后:

  • 生成解决方案增量生成并仅编译已更改的文件。如果装配体没有变化,则不会重建。另外,它不会删除任何中间文件。如果在Models库项目中修改一些代码,则建立解决方案。在下面的屏幕快照中,请参考DLL的时间戳,EXE在ModelsNotification库中的更新。

在此处输入图片说明

  • 重建解决方案删除所有编译的文件并编译所有文件,而不考虑更改,而忽略之前所做的任何操作。右键单击解决方案名称BuildRebuildClean。它的作用是删除所有程序集,EXE和引用的文件以再次编译。

在此处输入图片说明

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

在此处输入图片说明


2

我所知道的是Clean并不会执行“ make clean”曾经做过的工作-如果我要清洁解决方案,我希望它删除obj和bin文件/文件夹,以便其生成就像是对源代码的全新签出。根据我的经验,尽管我经常发现“清理并生成或重建”仍会在已知可编译的源代码上产生奇怪的错误,并且需要手动删除bin / obj文件夹,然后才能生成。


特别是在Xamarin项目中,我需要手动删除bin和obj文件夹以解决奇怪的编译错误
Miguel Febres


0

这仅与“构建解决方案”选项有关。

我完全厌倦了Visual Studio无法真正清理解决方案的能力,并编写了这个小工具来为您做这件事。

首先在VS中关闭解决方案,然后将其文件夹从Windows资源管理器拖到该应用程序或图标中。根据其窗口底部的设置,它还可以删除其他内容,如果您尝试将解决方案手动上载到GitHub或与他人共享它会有所帮助:

在此处输入图片说明

简而言之,它将把所有“调试”文件夹,Intellisense和其他可由VS重建的缓存放入回收站中。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.