Різниця між Rebuild і Clean + Build у Visual Studio


Відповіді:


308

Перебудувати = очистити + скласти (зазвичай)

Помітні деталі:

  1. Для багатопроектного рішення "відновити рішення" робить "чистим" з подальшим "складанням" для кожного проекту (можливо, паралельно). Тоді як "чисте рішення" з подальшим "рішенням для збирання" спочатку очищає всі проекти (можливо, паралельно), а потім будує всі проекти (можливо, паралельно). Ця різниця в послідовності подій може набути значного значення, коли вступлять міжпроектні залежності.

  2. Усі три дії відповідають цілям MSBuild. Таким чином, проект може змінити дію Rebuild, щоб зробити щось зовсім інше.


2
Отже , ви говорите , що Rebuild є точно такий же , як Clean з подальшим Будувати ? Це те, що я думав, але не був впевнений.
Джим Маккіт

43
За винятком того, як Rebuild очищає та відновлює кожен проект один за одним. Clean + Build очищає їх усіх, а потім створює всі. Різниця здебільшого, якщо натиснути її випадково :)
Євген

25
За винятком відсутності гарантії, що вони однакові. Дивіться відповідь Джаредапара, яка в поєднанні з графом - це ціла картина. Оскільки "Перебудова" робить кожен проект по черзі, у вас може бути "кутовий випадок", коли інформація про залежність буде змішана, і ви отримаєте проект побудови проекту "B" за допомогою старого проекту A, потім відновіть A, потім відновіть C. і т.д. повне рішення «Очищення» з подальшим побудовою повного рішення вирішить цю ситуацію, а відновлення не буде. Тож чим параноїдніший і втомлений ти, тим більше мусиш віддавати перевагу чистому, аніж будувати.
Джейсон Харрісон

14
Це не правда. У мене був проект, де Clean + Build вдався, і Rebuild повернув помилки компіляції (кругові посилання на файли). Тож вони не на 100% однакові.
Яаков Елліс

2
Можливо, з цієї публікації все змінилося, але є пояснення, чому Rebuild не є (вже не?) Таким же, як clean + build stackoverflow.com/questions/3095901/…
Дейв,

163

Граф правильний, що 99% часу відбудовувати = очищати + будувати.

Але вони гарантовано не будуть однаковими. 3 дії (відновити, побудувати, очистити) представляють різні цілі MSBuild. Кожен з яких може бути замінений будь-яким файлом проекту для виконання спеціальних дій. Тож цілком можливо, щоб хтось змінив перебудову, щоб зробити кілька дій, перш ніж ініціювати чисту + збірку (або видалити їх повністю).

Дуже сильний кутовий випадок, але вказуючи на це через обговорення коментарів.


Якщо ви додасте дії збірки, які переміщують .dll файли на нове місце, ви можете отримати «погані» результати збірки, просто виконавши перебудову. Якщо ви змішуєте vb.net та c # проект, речі стають ще гіршими, конструктори порушеної форми та відсутність роботи goto.
CodingBarfield

+1 Зауважимо також , що Rebuild поведінка не здається, відповідає за мовами щодо залежностей: stackoverflow.com/questions/12163080 / ...
lesscode

1
99% часу значно завищено.
Rhyous

57

Давайте визначимо реалізацію за замовчуванням реалізацію з точки зору реалізації за замовчуванням Clean and Build:

  1. За проект: Перебудувати проект = Очистити проект + Створити проект.

  2. За рішенням: Перебудувати sln = проект foreach у sln (Очистити проект + збірний проект).

Зауважте, що через відмінності в порядку виконання, відновити sln не є тим самим, як (Clean sln + Build sln) = (проект foreach у sln Очистити проект) + (проект foreach у sln проект збірки). Крім того, цей "foreach" може виконуватись одночасно, тому в двох сценаріях дозволено виконувати різні завдання.

Скажімо, у вас є sln, який містить proj1, proj2 та proj3.

  • Перебудувати sln = (Очистити proj1 + Створити proj1) & (Очистити proj2 + Створити proj2) & (Очистити proj3 + Створити proj3)

  • Clean Sln + Build Sln = (Очистити proj1 & Clean proj2 & Clean proj3) + (Build proj1 & Build proj2 & Build proj3)

+ означає серійний, & означає одночасний.

Отже, якщо залежності проектів не налаштовано правильно, є ймовірність, що при виконанні Rebuild sln частина ваших проектів посилається на усталене поле. Це тому, що всі очищення не гарантовано завершені до початку першої збірки. Якщо ви виконаєте Clean sln + Build sln, вони дадуть помилку посилання та повідомлять про це негайно, замість того, щоб надати вам додаток з дивною поведінкою.


7
Ця відповідь є найточнішою відповіддю, оскільки вона пояснює, чому іноді я не міг перебудувати, але зміг очистити + наростити.
Тоан Нгуен

11

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

Збірка означає компілювати та зв’язувати лише вихідні файли, які були змінені з моменту останньої збірки, тоді як Перебудувати означає компілювати та зв’язувати всі вихідні файли незалежно від того, змінили вони чи ні. Збірка - це нормальна річ і швидша. Іноді версії цільових компонентів проекту можуть вийти із синхронізації та відновитись, щоб зробити збірку успішною. На практиці ніколи не потрібно чистити.

Build or Rebuild Solution будує або відновлює всі проекти у вашому рішенні, тоді як Build або Rebuild будує або відновлює проект StartUp, "привіт" на екрані, знятому вище. Щоб встановити проект StartUp, клацніть правою кнопкою миші на потрібному імені проекту на вкладці Провідник рішень та виберіть Встановити як проект запуску. Назва проекту тепер з’являється жирним шрифтом. Оскільки рішення для домашніх завдань, як правило, мають лише один проект, рішення Build або Rebuild фактично таке ж, як Build або Rebuild.

Compile просто компілює вихідний файл, який зараз редагується. Корисно швидко перевірити наявність помилок, коли решта ваших вихідних файлів знаходяться в неповному стані, що заважало б успішному побудові всього проекту. Ctrl-F7 - це клавіша швидкого доступу для Compile.


Як і Тоан Нгуен, я переживав, що іноді Clean + Build Solution досягає успіху, коли рішення про перебудову не вдається (можливо, через залежність між проектами), тому ця відповідь вводить в оману, принаймні, у 2018 році.
Джон Кумбс

4

З цієї публікації в блозі, яку автор пов’язував як коментар до цього питання :

Насправді ні !!! вони не рівні.

Різниця в тому, що послідовність проектів очищається та будується. Скажімо, у нас є два проекти у вирішенні. Очистити, а потім скласти буде виконувати чисто для обох проектів, а потім збирання відбуватиметься індивідуально, тоді як під час відновлення проект A буде отримувати та очищати, а потім будувати після цього проект B буде чистим, а потім будувати і так далі.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.