ChatGPT解决这个技术问题 Extra ChatGPT

Visual Studio 中 Rebuild 和 Clean + Build 的区别

在 Visual Studio 2008 中仅重建和进行 Clean + Build 有什么区别? Clean + Build 与 Clean + Rebuild 不同吗?


J
Jon Coombs

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

值得注意的细节:

对于多项目解决方案,“重建解决方案”为每个项目执行“清理”,然后执行“构建”(可能并行)。而“清洁解决方案”后跟“构建解决方案”首先清理所有项目(可能并行),然后构建所有项目(可能并行)。当项目间的依赖关系开始发挥作用时,这种事件顺序的差异会变得很重要。所有三个操作都对应于 MSBuild 目标。所以一个项目可以覆盖重建操作来做一些完全不同的事情。


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

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

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

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


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

让我们根据默认的 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,他们会给出一个链接错误并立即让你知道,而不是给你一个行为奇怪的应用程序。


这是最准确的答案,因为它解释了为什么有时我无法重建,但能够清理 + 构建。
E
Eduardo Mello

来自 http://www.cs.tufts.edu/r/graphics/resources/vs_getting_started/vs_getting_started.htm,(刚刚用谷歌搜索):

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

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

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


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

来自作者链接为 a comment on this questionthis blog post

其实没有!!!他们是不平等的。不同之处在于项目清理和构建的顺序。假设我们在一个解决方案中有两个项目。清理然后构建将对两个项目执行清理,然后构建将单独发生,而在重建项目 A 将获取并清理然后构建,然后项目 B 将被清理然后构建等等。


N
NoJoshua

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