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

Ответы:

308

Перестроить = очистить + построить (обычно)

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

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

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

граф
источник
2
То есть вы говорите, что Rebuild - это то же самое, что и Clean, за которым следует Build ? Это то, о чем я думал, но я не был уверен.
Джим Маккит
43
За исключением Rebuild очищает и перестраивает каждый проект по одному. Clean + Build очищает их все, а затем строит все из них. В основном разница, если вы нажмете на нее случайно :)
Евгений
25
За исключением отсутствия гарантии, что они одинаковы. Смотрите ответ ДжаредПара ниже, который в сочетании с графом - это целая картина. Поскольку Rebuild выполняет каждый проект по очереди, у вас может быть «угловой случай», когда ваша информация о зависимостях испорчена, и вы получаете неупорядоченный проект сборки B, используя старый проект A, затем перестраивайте A, затем перестраивайте C. и т. Д. A полное решение Очистка с последующей полной сборкой решения поймает эту ситуацию, а перестройка - нет. Таким образом, чем более вы параноидальны и утомлены, тем больше вы должны отдавать предпочтение Clean, а затем Build.
Джейсон Харрисон
14
Это неправда. У меня был проект, в котором Clean + Build был успешным, и Rebuild вернул ошибки компиляции (циклические ссылки на файлы). Так что они не на 100% одинаковы.
Яаков Эллис
2
Может быть, после того, как этот пост изменился, но есть объяснение, почему Rebuild не (больше не?) Не то же самое, что clean + build stackoverflow.com/questions/3095901/…
Дейв
163

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

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

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

JaredPar
источник
Если вы добавите действия сборки, которые перемещают файлы .dll в новое место, вы можете получить «плохие» результаты сборки, просто выполнив перестройку. Если вы смешиваете проект vb.net и c #, дела обстоят еще хуже, не работают дизайнеры форм и не работают.
CodingBarfield
+1 Также обратите внимание, что поведение Rebuild не похоже на согласованность между языками в зависимости от зависимостей: stackoverflow.com/questions/12163080/…
lesscode
1
99% времени сильно переоценено.
Rhyous
58

Давайте определим реализацию 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, они выдадут ошибку ссылки и немедленно сообщат вам об этом, вместо того, чтобы показывать вам приложение со странным поведением.

Trout.Z
источник
7
Это самый точный ответ, так как он объясняет, почему иногда я не мог восстановить, но смог очистить + построить.
Тоан Нгуен
11

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

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

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

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

Эдуардо Мелло
источник
Как и Тоан Нгуен, я сталкивался с тем, что иногда решение Clean + Build успешно завершается в случае сбоя решения Rebuild (возможно, из-за межпроектных зависимостей), поэтому этот ответ вводит в заблуждение, по крайней мере, в 2018 году.
Джон Кумбс
4

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

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

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

Prageeth Godage
источник