在Visual Studio中重建与清理+构建之间的区别


Answers:


308

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

值得注意的细节:

  1. 对于多项目解决方案,“重建解决方案”对每个项目执行“清理”,然后执行“构建”(可能并行执行)。而“干净解决方案”之后是“构建解决方案”,则首先清理所有项目(可能并行),然后清理所有项目(可能并行)。当项目间的依赖关系发挥作用时,事件顺序的这种差异会变得很明显。

  2. 这三个动作均对应于MSBuild目标。因此,项目可以覆盖“重建”操作以执行完全不同的操作。


2
那么,你是说,重建准确相同的清洁接着是构建?这就是我的想法,但我不确定。
2009年

43
除了Rebuild清理和重建每个项目一个接一个。Clean + Build清理所有对象,然后生成所有对象。如果您不小心点击它,就会产生很大的不同:)
尤金(Eugene)2009年

25
除了缺乏保证它们相同外。请参阅下面的JaredPar的答案,它与伯爵的答案结合在一起,构成了整体情况。因为Rebuild会依次执行每个项目,所以当您的依赖项信息混乱并且使用旧项目A获得B的乱序生成项目,然后重新生成A,然后重新生成C时,您可能会遇到“危急情况”。A完整的解决方案先清理干净再进行完整的解决方案构建,会遇到这种情况,而不会进行重建。因此,您越是偏执和疲倦,就越应该倾向于“清洁”而非“构建”。
杰森·哈里森

14
这不是真的。我有一个成功完成Clean + Build的项目,并且Rebuild返回了编译错误(循环文件引用)。因此它们不是100%相同。
Yaakov Ellis

2
也许自从这篇文章发布以来,事情发生了变化,但是有一个解释说明为什么Rebuild与Clean + build不再(不再是?)相同stackoverflow.com/questions/3095901/…–
Dave

163

伯爵的说法是正确的,即99%的时间重建=清理+重建。

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

非常极端的情况,但由于评论讨论而指出。


如果添加将.dll文件移动到新位置的构建操作,则仅通过重新构建就可以得到“不好的”构建结果。如果将vb.net和c#项目混合在一起,则情况会变得更糟,表单设计器损坏,并且无法正常工作。
CodingBarfield 2010年

+1还要注意的是重建行为似乎并没有能够跨语言的一致性对于依赖关系:stackoverflow.com/questions/12163080/...
lesscode

1
99%的时间被大大高估了。
Rhyous

57

让我们根据默认的Clean和Build实现定义默认的Rebuild实现:

  1. 每个项目:重建项目=清理项目+生成项目。

  2. 每个解决方案:重建sln = sln中的foreach项目(清洁项目+构建项目)。

请注意,由于执行顺序的不同,Rebuild sln与(Clean sln + Build sln)=(sln Clean项目中的foreach项目)+(sln Build项目中的foreach项目)不同。同样,此“ foreach”可以同时执行,因此在两种情况下允许不同的任务同时运行。

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

  • 重建sln =(清洁proj1 +构建proj1)&(清洁proj2 +构建proj2)&(清洁proj3 +构建proj3)

  • 清洁Sln +构建Sln =(清洁proj1&清洁proj2&清洁proj3)+(构建proj1&构建proj2&构建proj3)

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

因此,如果未正确配置项目依赖项,则在执行Rebuild sln时,有些项目可能会链接到陈旧的库。那是因为不能保证所有清理工作都在第一个构建开始之前完成。如果您执行Clean sln + Build sln,它们将给出链接错误并立即通知您,而不是为您提供行为异常的应用程序。


7
这是最准确的答案,因为它解释了为什么有时我无法重建,但能够清理+重建。
Toan Nguyen 2012年

11

http://www.cs.tufts.edu/r/graphics/resources/vs_getting_started/vs_getting_started.htm中,(仅通过Google搜索):

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

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

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


像Toan Nguyen一样,我经历过有时Clean + Build Solution在Rebuild Solution失败的情况下会成功(可能是由于项目间的依赖性),所以这个答案至少在2018
Jon Coombs

4

这篇博客文章,作者为挂在这个问题上意见

其实不!!!他们不平等。

不同之处在于项目清理和构建的顺序。假设我们在解决方案中有两个项目。清理然后构建将对两个项目执行清理,然后构建将在重建时单独进行,项目A将获取并清理,然后在项目B清理并构建之后进行构建,依此类推。

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.