Visual Studio 中构建解决方案、重建解决方案和清理解决方案之间的区别?
Posted
技术标签:
【中文标题】Visual Studio 中构建解决方案、重建解决方案和清理解决方案之间的区别?【英文标题】:Difference between Build Solution, Rebuild Solution, and Clean Solution in Visual Studio? 【发布时间】:2011-03-06 23:18:23 【问题描述】:Visual Studio 中的 Build Solution、Rebuild Solution 和 Clean Solution 有什么区别?
什么时候适合使用这些?
【问题讨论】:
另见***.com/questions/1247457/… rebuild 和 clean then build 一样吗? @ColonelPanic 是的 【参考方案1】: Build solution 将执行增量构建:如果它不认为它需要重建项目,它不会。如果它们没有改变,它也可能使用项目的部分构建部分(我不知道这需要多长时间) Rebuild solution 将清理然后从头开始构建解决方案,忽略之前所做的任何事情。这与“清理,然后构建”之间的区别在于,Rebuild 将清理然后构建每个项目,一次一个,而不是清理所有项目然后构建所有项目。 Clean solution 将从之前的构建中删除构建工件。如果构建目标目录(bin 和 obj)中有任何其他文件,它们可能不会被删除,但实际的构建工件是。我已经看到了这种变化的行为 - 有时删除相当彻底,有时不删除 - 但我暂时让 VS 受益:)(链接指向 devenv.exe 命令行开关,但它们的作用与菜单项相同。)
【讨论】:
@womp:不在我刚刚查看的项目中。它仍然有所有的程序集...... 我个人发现“清洁解决方案”不仅没有帮助。如果我真的想要它干净,手动删除 bin 和 obj 文件夹是要走的路。甚至被抓到追逐幻影“错误”——直到我这样做。干净并不可靠。 如果工件通过其他方式而不是通过构建工件(例如,来自另一个源的副本集成为 cproj 中的 msbuidltask),那么 clean 将它们保留。这使得它几乎毫无用处,我什至会说它很危险,因为它会让你产生一种虚假的清洁感。 @Tod:过去我注意到,当 Rebuild 给我链接错误时,Clean+Build 可以工作。 @verdana:对于 github 等,拥有一个像样的.gitignore
文件更简单。但根据答案,根据我的经验,Clean 并不总是做得特别彻底。【参考方案2】:
构建解决方案:编译更改的代码文件(DLL 和 EXE)。
重建:删除所有已编译的文件并重新编译它们,无论代码是否已更改。
清理解决方案:删除所有已编译的文件(DLL 和 EXE 文件)。
您可以观看这个 YouTube 视频 (Visual Studio Build vs. Rebuild vs. Clean (C# interview questions with answers)),我在其中演示了不同之处,下面是视觉表示,可帮助您更详细地分析相同之处。
Rebuild 与(Clean + Build)之间的区别,因为这似乎也有一些混淆:
不同之处在于每个项目的构建和清理顺序的发生方式。假设您的解决方案有两个项目,“proj1”和“proj2”。如果您进行重建,它将使用“proj1”,清理(删除)“proj1”的编译文件并构建它。之后,它将获取第二个项目“proj2”,清理“proj2”的编译文件并编译“proj2”。
但如果你执行“清理”并构建“,它将首先删除“proj1”和“proj2”的所有编译文件,然后它会先构建“proj1”,然后再构建“proj2”。
【讨论】:
感谢您解释为什么重建并不总是有效,我经常需要在进行构建之前进行清理。 是的,描述和第二张图非常有用且清晰。如果您可以修复“非法”流程图,以便“是”只出现在一个地方,那将有所帮助。我真的不明白那个人想说什么,尤其是在“重建”下的“全部建设”。 @JonCoombs 是的,我认为第一个流程图并没有准确地捕捉到他在视频中所说的内容。我认为我插入的图像是 Shivprasad 的目标。【参考方案3】:取自this link:
构建意味着只编译和链接已更改的源文件 自上次构建以来,而重建 表示编译并链接所有源 文件,无论它们是否 改变与否。构建是正常的 要做的事情,而且速度更快。有时 项目目标的版本 组件可能会不同步,并且 重建是进行构建所必需的 成功的。在实践中,你永远不会 需要清洁。
【讨论】:
链接?我认为 DLL(又称动态链接库)的想法是在运行时链接? “在实践中你永远不需要清洁” piers7 你能提供一个你需要清理和重建的理由吗? @PaulBinder You needn't look too far.【参考方案4】:构建解决方案 - 构建任何已更改文件的程序集。如果程序集没有更改,则不会重新构建。也不会删除任何中间文件。
最常用。
重建解决方案 - 重建所有程序集而不考虑更改,但保留中间文件。
当您注意到 Visual Studio 未将您的更改合并到最新程序集中时使用。有时 Visual Studio 确实会出错。
清理解决方案 - 删除所有中间文件。
当所有其他方法都失败并且您需要清理所有内容并重新开始时使用。
【讨论】:
【参考方案5】:我只是认为重建是先执行清理,然后执行构建。也许我错了... cmets?
【讨论】:
这没有赞成票(直到现在),根据文档(请参阅乔恩答案中的链接),这是完全正确的。 我不这么认为。我有一种情况,先执行清洁解决方案,然后执行构建解决方案,但执行重建解决方案失败。这是一个新创建的解决方案,包含 2 个项目(一个依赖于另一个)。 @Cthutu 请参阅 Shivprasad 的回答,了解在此处有所作为的细节。 Rebuild 一次清理然后构建每个单独的项目,而运行 Clean 首先一次清理所有内容,然后 Build 一次构建所有项目。我遇到过这样的实例,其中清理/构建顺序的这种变化也会影响编译和不编译。 @Sean 也许这是由于在您的解决方案中将项目添加为file reference
而不是project reference
,因此项目构建顺序无法识别它必须先构建某个项目,并且程序集在构建过程中应该存在的位置不存在?【参考方案6】:
构建解决方案将构建解决方案中已更改的所有项目。无论如何,重建都会构建所有项目,干净的解决方案会删除所有临时文件,确保下一个构建完成。
【讨论】:
【参考方案7】:构建解决方案 - 构建解决方案将构建您的应用程序,并构建具有任何文件更改的项目数量。它不会清除任何现有的二进制文件,只是替换 bin 或 obj 文件夹中的更新程序集。
重建解决方案 - 重建解决方案将构建您的整个应用程序,构建您的解决方案中可用的所有项目并清理它们。在构建之前清除 bin 和 obj 文件夹中的所有二进制文件。
清洁解决方案 - 清洁解决方案只是清除 bin 和 obj 文件夹中的所有二进制文件。
【讨论】:
【参考方案8】:我认为人们遗漏的一件主要事情是构建和清理都是基于 Visual Studio 对您的项目/解决方案的了解而执行的任务。我看到很多抱怨 Clean 不起作用或留下剩余文件或不可信,而事实上,你说它不可信的原因实际上使它更可信。
Clean 只会删除(清理)Visual Studio 或编译器自己实际创建的文件和/或目录。如果您复制自己的文件或从外部工具或源创建的文件/文件夹结构,则 Visual Studio 不会“知道它们存在”,因此不应触摸它们。
你能想象如果 Clean 操作基本上执行了 "del *.*" 吗?这可能是灾难性的。
Build 对已更改或必要的项目执行编译。
重建会执行编译,无论更改或需要什么。
Clean 会删除它在过去创建的文件/文件夹,但会保留最初与它没有任何关系的任何内容。
我希望这能详细说明一下并有所帮助。
【讨论】:
"Clean 删除它在过去创建的文件/文件夹,但保留最初与它没有任何关系的任何内容。"大多数情况下,但并不完全正确。对于中间文件,是的,它完全删除了工具链生成的文件集。对于其他人,在构建输出目录中,它使用通配符模式,例如 *.pdb。如果您先执行清洁解决方案,然后执行构建解决方案,这将导致重建解决方案中不存在的竞争条件。【参考方案9】:我有一个空白解决方案BuildRebuildClean
和三个类库Models
,Repository
,Notification
。
我在Notification
类库中使用Models
和Repository
。
然后:
构建解决方案 增量构建并仅编译已更改的文件。如果程序集没有变化, 它不会被重建。此外,它不会删除任何中间文件。 如果修改Models
库项目中的一些代码,则构建解决方案。
在下面的屏幕截图中,参考 DLL 的时间戳,EXE 在Models
和Notification
库中更新。
重建解决方案删除所有已编译的文件并编译所有文件,而不考虑更改,
忽略之前做过的任何事情。
右键单击解决方案名称BuildRebuildClean
。它所做的是删除所有程序集,
需要重新编译的 EXE 和引用文件。
干净的解决方案从 bin/obj 目录中删除所有已编译的中间文件(即 EXE 和 DLL)。
【讨论】:
【参考方案10】:我所知道的是,Clean 不会像“make clean”那样做 - 如果我清理解决方案,我希望它会删除 obj 和 bin 文件/文件夹,这样它的构建就像是对源代码的全新签出.根据我的经验,虽然我经常发现 Clean and Build 或 Rebuild 仍然会在 已知编译 的源上产生奇怪的错误,并且需要手动删除 bin/obj 文件夹,然后它将构建。
【讨论】:
特别是在 Xamarin 项目中我需要手动删除 bin 和 obj 文件夹来解决奇怪的编译错误【参考方案11】:这仅与“构建解决方案”选项有关。
我完全厌倦了 Visual Studio 无法真正清理解决方案,并写了 this little tool 来为您解决问题。
首先在 VS 中关闭您的解决方案,然后将其文件夹从 Windows 资源管理器拖到此应用程序或其图标中。根据其窗口底部的设置,它还可以删除其他内容,如果您尝试手动将解决方案上传到 GitHub 或与其他人共享,这将有所帮助:
简而言之,它将所有“Debug”文件夹、Intellisense 和其他可以通过 VS 重建的缓存为您放入回收站。
【讨论】:
【参考方案12】:构建解决方案只构建解决方案中发生变化的项目,不影响没有变化的程序集,
ReBuild 首先清理解决方案中的所有程序集,然后构建整个解决方案,无论是否进行了更改。
清洁,只需清洁溶液。
【讨论】:
Rebuild cleans the projects one at a time which is not the same asClean + Build
.【参考方案13】:
Clean
将清理 bin/Debug 文件夹中的工件。表示删除 bin/Debug 文件夹中的所有文件。
Build
检查 bin/Debug 文件夹中的工件,如果需要,然后创建工件(同时检查构建时间错误)。
Rebuild
= Clean
+ Build
一口气。这将首先删除 bin/Debug 文件夹中的所有文件,然后在 bin/Debug 文件夹中再次创建工件。
可以通过打开并观察 bin/Debug(或 Release)文件夹,然后清理、构建和重建项目来确认这些操作。
【讨论】:
Rebuild 会逐个项目地清理然后构建项目。如果中间或构建输出目录由同一解决方案中的多个项目共享,这与解决方案上的 Clean 后跟解决方案上的 Build 不同。以上是关于Visual Studio 中构建解决方案、重建解决方案和清理解决方案之间的区别?的主要内容,如果未能解决你的问题,请参考以下文章
Visual Studio中Rebuild和Clean + Build之间的区别
如果打包 UWP,Visual Studio 总是重建解决方案
Visual Studio 有时会在 PC 重新启动后重建未修改的项目
并行构建 Visual Studio 解决方案会丢失一些静态库的 PDB