Visual Studio 中的构建解决方案、重建解决方案和清理解决方案有什么区别?
什么时候适合使用这些中的每一个?
构建解决方案将执行增量构建:如果它认为不需要重新构建项目,则不会。如果它们没有改变,它也可能使用项目的部分构建位(我不知道它需要多远)
重建解决方案将清理然后从头开始构建解决方案,忽略之前所做的任何事情。这与“清理,然后构建”之间的区别在于,Rebuild 将清理然后构建每个项目,一次一个,而不是清理所有然后构建所有项目。
干净的解决方案将从以前的构建中删除构建工件。如果构建目标目录(bin 和 obj)中有任何其他文件,它们可能不会被删除,但实际的构建工件是。我已经看到了这种变化的行为——有时删除得相当彻底,有时不删除——但我暂时会给 VS 带来怀疑的好处:)
(链接指向 devenv.exe 命令行开关,但它们的作用与菜单项相同。)
构建解决方案:编译更改的代码文件(DLL 和 EXE)。
重建:删除所有已编译的文件并再次编译它们,无论代码是否已更改。
清理解决方案:删除所有编译文件(DLL 和 EXE 文件)。
您可以观看这个 YouTube 视频 (Visual Studio Build vs. Rebuild vs. Clean (C# interview questions with answers)),我在其中演示了差异,下面是可视化表示,可帮助您更详细地分析相同点。
https://i.stack.imgur.com/puzQf.png
Rebuild 与(Clean + Build)之间的区别,因为这似乎也有一些混淆:
不同之处在于每个项目的构建和清理序列发生的方式。假设您的解决方案有两个项目,“proj1”和“proj2”。如果您进行重建,它将使用“proj1”,清理(删除)“proj1”的编译文件并构建它。之后,它将获取第二个项目“proj2”,清理“proj2”的编译文件并编译“proj2”。
但是,如果您执行“清理”并构建,它将首先删除“proj1”和“proj2”的所有编译文件,然后它将首先构建“proj1”,然后再构建“proj2”。
https://i.stack.imgur.com/JboKH.png
取自 this link:
Build 意味着只编译和链接自上次构建以来发生变化的源文件,而 Rebuild 意味着编译和链接所有源文件,无论它们是否改变。构建是正常的事情,而且速度更快。有时项目目标组件的版本可能会不同步,因此需要重新构建才能使构建成功。在实践中,您永远不需要清洁。
构建解决方案 - 构建任何已更改文件的程序集。如果程序集没有更改,则不会重新构建。也不会删除任何中间文件。
最常用。
重建解决方案 - 无论更改如何重建所有程序集,但保留中间文件。
当您注意到 Visual Studio 未将您的更改合并到最新程序集中时使用。有时 Visual Studio 确实会出错。
清洁解决方案 - 删除所有中间文件。
当所有其他方法都失败并且您需要清理所有内容并重新开始时使用。
我只是认为 Rebuild 首先执行 Clean,然后是 Build。也许我错了……评论?
file reference
而不是 project reference
导致项目构建顺序无法识别它必须在另一个项目之前构建某个项目,并且程序集不存在在构建过程中它应该在哪里?
构建解决方案将构建解决方案中已更改的任何项目。无论如何,重建都会构建所有项目,干净的解决方案会删除所有临时文件,以确保下一个构建完成。
构建解决方案 - 构建解决方案将通过构建具有任何文件更改的项目数量来构建您的应用程序。它不会清除任何现有的二进制文件,只是替换 bin 或 obj 文件夹中的更新程序集。
重建解决方案 - 重建解决方案将构建您的整个应用程序,构建您的解决方案中可用的所有项目并清理它们。在构建之前,它会清除 bin 和 obj 文件夹中的所有二进制文件。
清洁解决方案 - 清洁解决方案只是清除 bin 和 obj 文件夹中的所有二进制文件。
我认为人们遗漏的一件主要事情是构建和清理都是基于 Visual Studio 对您的项目/解决方案的了解而执行的任务。我看到很多抱怨 Clean 不起作用或留下剩余文件或不值得信赖,而事实上,你说它不值得信赖的原因实际上使它更值得信赖。
Clean 只会删除(清理)Visual Studio 或编译器本身实际上创建的文件和/或目录。如果您复制自己的文件或文件/文件夹结构是从外部工具或源创建的,那么 Visual Studio 不会“知道它们存在”,因此不应触及它们。
你能想象如果 Clean 操作基本上执行了 "del *.*" 吗?这可能是灾难性的。
Build 对更改或必要的项目执行编译。
无论更改或需要什么,Rebuild 都会执行编译。
Clean 删除它过去创建的文件/文件夹,但最初会留下与它没有任何关系的任何内容。
我希望这能详细说明一下并有所帮助。
我有一个空白解决方案 BuildRebuildClean
和三个类库 Models
、Repository
、Notification
。
我在 Notification
类库中使用 Models
和 Repository
。
然后:
构建解决方案 增量构建并仅编译已更改的文件。如果程序集没有更改,则不会重新构建。此外,它不会删除任何中间文件。如果修改模型库项目中的一些代码,则构建解决方案。在下面的屏幕截图中,参考 DLL 的时间戳,EXE 在模型和通知库中更新。
https://i.stack.imgur.com/ROAVj.png
重建解决方案删除所有已编译的文件并编译所有文件,而不考虑更改,忽略之前所做的任何事情。右键单击解决方案名称 BuildRebuildClean。它所做的是删除所有程序集、EXE 和引用文件以再次编译。
https://i.stack.imgur.com/XCMwT.png
Clean Solution 从 bin/obj 目录中删除所有已编译的中间文件(即 EXE 和 DLL)。
https://i.stack.imgur.com/aBm7K.png
我所知道的是,Clean 不会像以前那样做“make clean”——如果我清理解决方案,我希望它会删除 obj 和 bin 文件/文件夹,这样它的构建就像是对源代码的全新签出。根据我的经验,虽然我经常发现 Clean and Build 或 Rebuild 仍然会在已知可编译的源上产生奇怪的错误,并且需要手动删除 bin/obj 文件夹,然后它会构建。
这仅与“构建解决方案”选项有关。
我完全厌倦了 Visual Studio 无法真正清理解决方案,并编写了 this little tool 来为您解决问题。
首先在 VS 中关闭您的解决方案,然后将其文件夹从 Windows 资源管理器拖到此应用程序或其图标中。根据其窗口底部的设置,它还可以删除其他内容,如果您尝试手动将解决方案上传到 GitHub 或与其他人共享,这将有所帮助:
https://i.stack.imgur.com/CzPzt.png
简而言之,它将所有“Debug”文件夹、Intellisense 和其他可以由 VS 重建的缓存为您放入回收站。
构建解决方案仅构建解决方案中已更改的项目,不会影响未更改的程序集,
ReBuild 首先清理解决方案中的所有程序集,然后构建整个解决方案,无论是否进行了更改。
清洁,只需清洁溶液。
Clean
将清理 bin/Debug 文件夹中的工件。表示删除 bin/Debug 文件夹中的所有文件。
Build
检查 bin/Debug 文件夹中的工件,如果需要,然后创建工件(同时检查构建时错误)。
Rebuild
= Clean
+ Build
一次。这将首先删除 bin/Debug 文件夹中的所有文件,然后在 bin/Debug 文件夹中再次创建工件。
可以通过打开并观察 bin/Debug(或 Release)文件夹,然后清理、构建和重建项目来确认这些操作。
**Build ,Rebuild, Clean Solution**
清理解决方案:删除所有已编译的文件(所有 dll 和 exe)。
构建解决方案:编译已更改的代码文件(dll 和 exe)。
重建解决方案:删除所有已编译的文件并重新编译它们,无论代码是否已更改。
.gitignore
文件更简单。但根据答案,根据我的经验,Clean 并不总是做得特别彻底。