ChatGPT解决这个技术问题 Extra ChatGPT

Visual Studio 中构建解决方案、重建解决方案和清理解决方案之间的区别?

Visual Studio 中的构建解决方案、重建解决方案和清理解决方案有什么区别?

什么时候适合使用这些中的每一个?

重建与清洁然后构建相同吗?
@ColonelPanic 是的

B
Bill Tür stands with Ukraine

构建解决方案将执行增量构建:如果它认为不需要重新构建项目,则不会。如果它们没有改变,它也可能使用项目的部分构建位(我不知道它需要多远)

重建解决方案将清理然后从头开始构建解决方案,忽略之前所做的任何事情。这与“清理,然后构建”之间的区别在于,Rebuild 将清理然后构建每个项目,一次一个,而不是清理所有然后构建所有项目。

干净的解决方案将从以前的构建中删除构建工件。如果构建目标目录(bin 和 obj)中有任何其他文件,它们可能不会被删除,但实际的构建工件是。我已经看到了这种变化的行为——有时删除得相当彻底,有时不删除——但我暂时会给 VS 带来怀疑的好处:)

(链接指向 devenv.exe 命令行开关,但它们的作用与菜单项相同。)


@womp:不在我刚刚查看的项目中。它仍然有所有的程序集......
我个人发现“清洁解决方案”不仅没有帮助。如果我真的想要它干净,手动删除 bin 和 obj 文件夹是要走的路。甚至被抓到追逐幻影“错误”——直到我这样做。清洁只是不可靠。
如果工件通过其他方式而不是通过构建工件(例如,来自另一个源的副本集成为 cproj 中的 msbuidltask),那么 clean 会保留它们。这使得它几乎毫无用处,我什至会说它很危险,因为它会让你产生一种虚假的清洁感。
@Tod:我过去注意到,当 Rebuild 给我链接错误时,Clean+Build 可以工作。
@verdana:对于 github 等,拥有一个像样的 .gitignore 文件更简单。但根据答案,根据我的经验,Clean 并不总是做得特别彻底。
r
ruffin

构建解决方案:编译更改的代码文件(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


感谢您解释为什么重建并不总是有效,并且我经常需要在进行构建之前进行清理。
是的,描述和第二张图表非常有帮助和清晰。如果您可以修复“非法”流程图,以便“是”只出现在一个地方,那将有所帮助。我真的不明白那个人想说什么,尤其是在“重建”下的“构建所有”。
@JonCoombs 是的,我认为第一个流程图并没有准确地捕捉到他在视频中所说的话。我认为我插入的图像是 Shivprasad 的目标。
M
Matthew Jones

取自 this link

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


关联?我认为 DLL(又名动态链接库)的想法是在运行时链接?
“在实践中,你永远不需要清洁”<-我在这个问题上打电话给 BS。
piers7 然后你能提供一个你需要清理和重建的理由吗?
Y
Yasser Shaikh

构建解决方案 - 构建任何已更改文件的程序集。如果程序集没有更改,则不会重新构建。也不会删除任何中间文件。

最常用。

重建解决方案 - 无论更改如何重建所有程序集,但保留中间文件。

当您注意到 Visual Studio 未将您的更改合并到最新程序集中时使用。有时 Visual Studio 确实会出错。

清洁解决方案 - 删除所有中间文件。

当所有其他方法都失败并且您需要清理所有内容并重新开始时使用。


K
Ken Richards

我只是认为 Rebuild 首先执行 Clean,然后是 Build。也许我错了……评论?


这没有赞成票(直到现在),根据文档(请参阅乔恩答案中的链接),这是完全正确的。
我认为不会。我有一种情况,先执行清洁解决方案,然后执行构建解决方案,但执行重建解决方案失败。这是一个新创建的具有 2 个项目的解决方案(一个依赖于另一个)。
@Cthutu 请参阅 Shivprasad 的答案,了解在此处有所作为的细节。 Rebuild 一次清理然后构建每个单独的项目,而运行 Clean 首先一次清理所有内容,然后 Build 一次构建所有项目。我遇到过这样的实例,其中清理/构建顺序的这种变化也会在编译和不编译之间产生差异。
@Sean 也许这是由于在您的解决方案中将项目添加为 file reference 而不是 project reference 导致项目构建顺序无法识别它必须在另一个项目之前构建某个项目,并且程序集不存在在构建过程中它应该在哪里?
S
Steven Evers

构建解决方案将构建解决方案中已更改的任何项目。无论如何,重建都会构建所有项目,干净的解决方案会删除所有临时文件,以确保下一个构建完成。


S
Sabaridass R

构建解决方案 - 构建解决方案将通过构建具有任何文件更改的项目数量来构建您的应用程序。它不会清除任何现有的二进制文件,只是替换 bin 或 obj 文件夹中的更新程序集。

重建解决方案 - 重建解决方案将构建您的整个应用程序,构建您的解决方案中可用的所有项目并清理它们。在构建之前,它会清除 bin 和 obj 文件夹中的所有二进制文件。

清洁解决方案 - 清洁解决方案只是清除 bin 和 obj 文件夹中的所有二进制文件。


C
Chase

我认为人们遗漏的一件主要事情是构建和清理都是基于 Visual Studio 对您的项目/解决方案的了解而执行的任务。我看到很多抱怨 Clean 不起作用或留下剩余文件或不值得信赖,而事实上,你说它不值得信赖的原因实际上使它更值得信赖。

Clean 只会删除(清理)Visual Studio 或编译器本身实际上创建的文件和/或目录。如果您复制自己的文件或文件/文件夹结构是从外部工具或源创建的,那么 Visual Studio 不会“知道它们存在”,因此不应触及它们。

你能想象如果 Clean 操作基本上执行了 "del *.*" 吗?这可能是灾难性的。

Build 对更改或必要的项目执行编译。

无论更改或需要什么,Rebuild 都会执行编译。

Clean 删除它过去创建的文件/文件夹,但最初会留下与它没有任何关系的任何内容。

我希望这能详细说明一下并有所帮助。


“清理会删除它过去创建的文件/文件夹,但最初会留下与它没有任何关系的任何东西。”大多数情况下,但并不完全正确。对于中间文件,是的,它完全删除了工具链生成的文件集。对于其他人,在构建输出目录中,它使用通配符模式,例如 *.pdb。如果您先执行清洁解决方案,然后执行构建解决方案,这会导致重建解决方案中不存在竞争条件。
A
Amira Bedhiafi

我有一个空白解决方案 BuildRebuildClean 和三个类库 ModelsRepositoryNotification

我在 Notification 类库中使用 ModelsRepository

然后:

构建解决方案 增量构建并仅编译已更改的文件。如果程序集没有更改,则不会重新构建。此外,它不会删除任何中间文件。如果修改模型库项目中的一些代码,则构建解决方案。在下面的屏幕截图中,参考 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


s
steve

我所知道的是,Clean 不会像以前那样做“make clean”——如果我清理解决方案,我希望它会删除 obj 和 bin 文件/文件夹,这样它的构建就像是对源代码的全新签出。根据我的经验,虽然我经常发现 Clean and Build 或 Rebuild 仍然会在已知可编译的源上产生奇怪的错误,并且需要手动删除 bin/obj 文件夹,然后它会构建。


特别是在 Xamarin 项目中,我需要手动删除 bin 和 obj 文件夹以解决奇怪的编译错误
a
ahmd0

这仅与“构建解决方案”选项有关。

我完全厌倦了 Visual Studio 无法真正清理解决方案,并编写了 this little tool 来为您解决问题。

首先在 VS 中关闭您的解决方案,然后将其文件夹从 Windows 资源管理器拖到此应用程序或其图标中。根据其窗口底部的设置,它还可以删除其他内容,如果您尝试手动将解决方案上传到 GitHub 或与其他人共享,这将有所帮助:

https://i.stack.imgur.com/CzPzt.png

简而言之,它将所有“Debug”文件夹、Intellisense 和其他可以由 VS 重建的缓存为您放入回收站。


y
yashashwi

构建解决方案仅构建解决方案中已更改的项目,不会影响未更改的程序集,

ReBuild 首先清理解决方案中的所有程序集,然后构建整个解决方案,无论是否进行了更改。

清洁,只需清洁溶液。


D
Dharman

Clean 将清理 bin/Debug 文件夹中的工件。表示删除 bin/Debug 文件夹中的所有文件。

Build 检查 bin/Debug 文件夹中的工件,如果需要,然后创建工件(同时检查构建时错误)。

Rebuild = Clean + Build 一次。这将首先删除 bin/Debug 文件夹中的所有文件,然后在 bin/Debug 文件夹中再次创建工件。

可以通过打开并观察 bin/Debug(或 Release)文件夹,然后清理、构建和重建项目来确认这些操作。


Rebuild 执行 Clean 然后逐个项目构建项目。如果中间或构建输出目录由同一解决方案中的多个项目共享,则这与解决方案上的清理和解决方案上的构建不同。
A
Ali Mahdian
**Build ,Rebuild, Clean Solution**

清理解决方案:删除所有已编译的文件(所有 dll 和 exe)。

构建解决方案:编译已更改的代码文件(dll 和 exe)。

重建解决方案:删除所有已编译的文件并重新编译它们,无论代码是否已更改。