Visual Studio 中 Rebuild 和 Clean + Build 的区别

Posted

技术标签:

【中文标题】Visual Studio 中 Rebuild 和 Clean + Build 的区别【英文标题】:Difference between Rebuild and Clean + Build in Visual Studio 【发布时间】:2010-11-17 20:40:39 【问题描述】:

在 Visual Studio 2008 中,重建Clean + Build 有什么区别? Clean + BuildClean + Rebuild 不同吗?

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

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

    每个项目:重建项目 = 清理项目 + 构建项目。

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

注意,由于执行顺序的不同,Rebuild sln 不等于 (Clean sln + Build sln) = (foreach project in sln Clean project) + (foreach project in sln Build project)。另外,这个“foreach”可能是并发执行的,所以两种场景下允许不同的任务同时运行。

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

重建 sln = (Clean proj1 + Build proj1) & (Clean proj2 + Build proj2) & (Clean proj3 + Build proj3)

Clean Sln + Build Sln = (Clean proj1 & Clean proj2 & Clean proj3) + (Build proj1 & Build proj2 & Build proj3)

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

因此,如果项目依赖项配置不正确,那么当您执行 Rebuild sln 时,您的一些项目可能会链接到一个陈旧的库。这是因为不能保证在第一次构建开始之前完成所有清理。如果你执行 Clean sln + Build sln,他们会给出一个链接错误并立即通知你,而不是给你一个行为奇怪的应用程序。

【讨论】:

这是最准确的答案,因为它解释了为什么有时我无法重建,但能够清理 + 构建。【参考方案3】:

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

值得注意的细节:

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

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

【讨论】:

所以您是说 RebuildClean 后跟 Build完全相同 /i>?我是这么想的,但我不确定。 除了 Rebuild 清理和重建每个项目一个一个。 Clean+Build 清理所有这些,然后构建所有它们。如果您不小心单击它,则主要会有所不同:) 除非不能保证它们是相同的。请参阅下面的 JaredPar 的答案,结合 Earl 的答案是全貌。因为 Rebuild 依次执行每个项目,所以当您的依赖信息被弄乱并且您使用旧项目 A 然后重新构建 A,然后重新构建 C 等得到 B 的无序构建项目时,您可能会遇到“极端情况”。完整的解决方案 Clean 之后是完整的解决方案构建将捕获这种情况,而重建则不会。因此,您越是偏执和疲倦,您应该越倾向于清洁然后构建。 这不是真的。我有一个项目,其中 Clean + Build 成功,并且 Rebuild 返回了编译错误(循环文件引用)。所以它们不是 100% 相同的。 也许自从这篇文章发生了变化,但有一个解释为什么 Rebuild 与 clean + build 不同(不再?)***.com/questions/3095901/…【参考方案4】:

来自this blog post,作者链接为a comment on this question:

其实没有!!!他们是不平等的。

不同之处在于项目清理和构建的顺序。让 假设我们在一个解决方案中有两个项目。清理然后构建将 对两个项目执行清理,然后单独进行构建 在重建项目 A 将获取并清理,然后在之后构建 该项目 B 将是干净的,然后构建等等。

【讨论】:

【参考方案5】:

Earl 是正确的,99% 的时间 Rebuild = Clean + Build。

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

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

【讨论】:

如果您添加将 .dll 文件移动到新位置的构建操作,您只需进行重建就可以获得“糟糕”的构建结果。如果您将 vb.net 和 c# 项目混合使用,情况会变得更糟,表单设计器损坏且无法正常工作。 +1 另请注意,在依赖关系方面,跨语言的重建行为似乎并不一致:***.com/questions/12163080/… 99% 的时间被大大高估了。【参考方案6】:

来自http://www.cs.tufts.edu/r/graphics/resources/vs_getting_started/vs_getting_started.htm,(刚刚google了一下):

Build 意味着只编译和链接自上次构建以来发生变化的源文件,而 Rebuild 意味着编译和链接所有源文件,无论它们是否改变。构建是正常的事情,而且速度更快。有时项目目标组件的版本可能会不同步,因此需要重新构建才能使构建成功。实际上,您永远不需要清洁。

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

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

【讨论】:

像 Toan Nguyen 一样,我经历过有时 Clean+Build 解决方案会在重建解决方案失败的情况下成功(可能是由于项目间的依赖关系),所以这个答案具有误导性,至少在 2018 年是这样。

以上是关于Visual Studio 中 Rebuild 和 Clean + Build 的区别的主要内容,如果未能解决你的问题,请参考以下文章

如何提高Visual Studio编译速度

android studio中clean项目和rebuild项目的区别

Android Studio 3.5 原因:buildOutput.apkData 不能为空 Clean & Rebuild 已经尝试过

visual studio 2013 wpf 添加窗口加载和关闭函数

如何在visual studio2008中创建,编译和运行C++程序,

visual studio 和visual studio code 的区别