Разница между перестроением и чисткой + сборка в Visual Studio

В чем разница между простой перестройкой и сборкой Clean + Build в Visual Studio 2008? Отличается ли Clean + Build от выполнения Clean + Rebuild ?

7.08.2009 23:32:16
Zaheer Ahmed 21.11.2013 08:36:01
5 ОТВЕТОВ
РЕШЕНИЕ

Перестроить = Очистить + Сборка (обычно)

Известные детали:

  1. Для решения с несколькими проектами «решение по перестройке» выполняет «очистку» с последующей «сборкой» для каждого проекта (возможно, параллельно). Принимая во внимание, что «чистое решение», за которым следует «решение для сборки», сначала очищает все проекты (возможно, параллельно), а затем строит все проекты (возможно, параллельно). Эта разница в последовательности событий может стать значительной, когда в игру вступают межпроектные зависимости.

  2. Все три действия соответствуют целям MSBuild. Таким образом, проект может переопределить действие Rebuild, чтобы сделать что-то совершенно другое.

306
22.11.2018 06:56:20
То есть вы говорите, что Rebuild - это то же самое, что и Clean, за которым следует Build ? Это то, о чем я думал, но я не был уверен.
Jim McKeeth 7.08.2009 23:50:39
За исключением Rebuild очищает и перестраивает каждый проект по одному. Clean + Build очищает их все, а затем строит все. В основном разница, если вы нажмете на нее случайно :)
Eugene 8.08.2009 03:35:07
За исключением отсутствия гарантии, что они одинаковы. Смотрите ответ ДжаредПара ниже, который в сочетании с графом - это целая картина. Поскольку Rebuild выполняет каждый проект по очереди, у вас может быть «угловой случай», когда ваша информация о зависимостях испорчена, и вы получаете неупорядоченный проект сборки B, используя старый проект A, затем перестраивайте A, затем перестраивайте C. и т. Д. A полное решение Очистка с последующей полной сборкой решения поймает эту ситуацию, а перестройка - нет. Таким образом, чем более вы параноидальны и устали, тем больше вы должны отдавать предпочтение Clean, а затем Build.
Jason Harrison 12.01.2010 17:44:27
Это неправда. У меня был проект, в котором Clean + Build был успешным, и Rebuild вернул ошибки компиляции (циклические ссылки на файлы). Так что они не на 100% одинаковы.
Yaakov Ellis♦ 20.10.2010 13:29:18
Может быть, после того, как этот пост изменился, но есть объяснение, почему Rebuild не (больше не?) Не то же самое, что clean + build stackoverflow.com/questions/3095901/…
Dave 13.05.2014 07:49:44

Эрл прав, что в 99% случаев Rebuild = Clean + Build.

Но они не гарантированы быть одинаковыми. 3 действия (перестроить, собрать, очистить) представляют разные цели MSBuild. Каждый из которых может быть переопределен любым файлом проекта для выполнения пользовательских действий. Таким образом, кто-то может полностью переопределить rebuild, выполнив несколько действий перед началом clean + build (или полностью удалить их).

Очень угловой случай, но указывающий на это из-за комментариев.

163
17.02.2012 03:58:57
Если вы добавите действия сборки, которые перемещают файлы .dll в новое место, вы можете получить «плохие» результаты сборки, просто выполнив перестройку. Если вы смешиваете проект vb.net и c #, дела обстоят еще хуже, не работают дизайнеры форм и не работают.
CodingBarfield 24.08.2010 07:11:00
+1 Обратите внимание также, что поведение Rebuild не похоже на согласованность между языками в зависимости от зависимостей: stackoverflow.com/questions/12163080/…
lesscode 28.08.2012 19:02:52
99% времени значительно переоценено.
Rhyous 23.03.2018 14:37:57

С http://www.cs.tufts.edu/r/graphics/resources/vs_getting_started/vs_getting_started.htm , (просто погуглил):

Сборка означает компиляцию и связывание только исходных файлов, которые изменились со времени последней сборки, в то время как «Перестройка» означает компиляцию и компоновку всех исходных файлов независимо от того, изменились они или нет. Сборка - это нормальное занятие, которое выполняется быстрее. Иногда версии целевых компонентов проекта могут быть не синхронизированы, и для успешной сборки требуется перестройка. На практике вам никогда не нужно чистить.

Build or Rebuild Solution строит или перестраивает все проекты в вашем решении, в то время как Build или Rebuild компилирует или перестраивает проект StartUp, "привет" на снимке экрана выше. Чтобы настроить проект автозагрузки, щелкните правой кнопкой мыши имя нужного проекта на вкладке «Обозреватель решений» и выберите «Установить как проект автозагрузки». Название проекта теперь выделено жирным шрифтом. Поскольку решения для домашних заданий обычно имеют только один проект, решение по сборке или перестроению фактически совпадает с решением по сборке или перестроению.

Компиляция просто компилирует исходный файл, который в данный момент редактируется. Полезно для быстрой проверки ошибок, когда остальные исходные файлы находятся в неполном состоянии, что помешает успешной сборке всего проекта. Ctrl-F7 - это сочетание клавиш для компиляции.

11
21.08.2009 13:10:39
Как и Тоан Нгуен, я сталкивался с тем, что иногда решение Clean + Build успешно завершается в случае сбоя решения Rebuild (возможно, из-за межпроектных зависимостей), поэтому этот ответ вводит в заблуждение, по крайней мере, в 2018 году.
Jon Coombs 21.11.2018 18:26:12

Давайте определим реализацию Rebuild по умолчанию в терминах реализаций Clean и Build по умолчанию:

  1. Для каждого проекта: перестроить проект = очистить проект + построить проект.

  2. По решению: перестроить sln = foreach проект в sln (чистый проект + построить проект).

Обратите внимание, что из-за различий в порядке выполнения Rebuild sln отличается от (Clean sln + Build sln) = (foreach проект в sln Очистить проект) + (foreach проект в sln Build project). Кроме того, этот «foreach» может выполняться одновременно, поэтому разные задачи могут выполняться одновременно в двух сценариях.

Скажем, у вас есть sln, который содержит proj1, proj2 и proj3.

  • Перестроить sln = (Очистить proj1 + Построить proj1) & (Очистить proj2 + Построить proj2) & (Очистить proj3 + Построить proj3)

  • Clean Sln + Build Sln = (Очистить proj1 & Очистить proj2 & Очистить proj3) + (Создать proj1 & Build proj2 & Build proj3)

+ означает последовательный, & означает одновременный.

Поэтому, если зависимости проекта не настроены правильно, есть вероятность, что при выполнении Rebuild sln некоторые из ваших проектов ссылаются на устаревшую библиотеку. Это потому, что не гарантируется, что все очистки будут завершены до начала первой сборки. Если вы выполните команду Clean sln + Build sln, они выдадут ошибку ссылки и немедленно сообщат вам об этом, вместо того, чтобы показывать вам приложение со странным поведением.

57
26.01.2020 09:12:28
Это самый точный ответ, так как он объясняет, почему иногда я не мог восстановить, но смог очистить + собрать.
Toan Nguyen 27.06.2012 01:23:12

Из этого поста в блоге, на который автор ссылался как комментарий к этому вопросу :

Вообще-то, нет!!! они не равны.

Разница в том, как проекты очищаются и строятся. Допустим, у нас есть два проекта в решении. Очистка и последующая сборка будут выполнять очистку для обоих проектов, и затем сборка будет выполняться индивидуально, в то время как при восстановлении проект А будет получать и очищать, а затем строить после того, как этот проект В будет очищен, а затем будет построен и так далее.

4
23.05.2017 11:47:18