Differenza tra Rebuild e Clean + Build in Visual Studio


Risposte:


308

Ricostruisci = Clean + Build (di solito)

Dettagli notevoli:

  1. Per una soluzione multiprogetto, "ricostruisci soluzione" esegue un "clean" seguito da una "build" per ciascun progetto (possibilmente in parallelo). Considerando che una "soluzione pulita" seguita da una "soluzione di costruzione" pulisce prima tutti i progetti (possibilmente in parallelo) e quindi costruisce tutti i progetti (possibilmente in parallelo). Questa differenza nel sequenziamento degli eventi può diventare significativa quando entrano in gioco le dipendenze tra progetti.

  2. Tutte e tre le azioni corrispondono agli obiettivi di MSBuild. Quindi un progetto può sovrascrivere l'azione Ricostruisci per fare qualcosa di completamente diverso.


2
Quindi stai dicendo che Rebuild è esattamente lo stesso di un Clean seguito da un Build ? È un po 'quello che pensavo, ma non ero sicuro.
Jim McKeeth,

43
Tranne che Rebuild pulisce e ricostruisce ogni progetto uno per uno. Clean + Build li pulisce tutti e poi li costruisce tutti. Fa la differenza soprattutto se si fa clic per errore :)
Eugene

25
Tranne la mancanza di garanzia che siano uguali. Vedi la risposta di JaredPar di seguito, che in combinazione con Earl è il quadro completo. Poiché Rebuild esegue ogni progetto a turno, è possibile avere un "caso angolare" quando le informazioni sulla dipendenza sono incasinate e si ottiene un progetto di build fuori servizio di B che utilizza il vecchio progetto A, quindi si ricostruisce A, quindi si ricostruisce C. ecc. A soluzione completa Clean seguita da una soluzione completa build colmerà questa situazione mentre una ricostruzione no. Quindi più paranoico e stanco sei, più dovresti favorire verso Clean quindi Build.
Jason Harrison,

14
Questo non è vero. Ho avuto un progetto in cui Clean + Build è riuscito e Rebuild ha restituito errori di compilazione (riferimenti a file circolari). Quindi non sono uguali al 100%.
Yaakov Ellis

2
Forse da quando questo post le cose sono cambiate, ma c'è una spiegazione del motivo per cui Rebuild non è (non più?) Uguale a clean + build stackoverflow.com/questions/3095901/…
Dave,

163

Earl ha ragione che il 99% delle volte Rebuild = Clean + Build.

Ma non è garantito che siano uguali. Le 3 azioni (ricostruzione, creazione, pulizia) rappresentano diversi target di MSBuild. Ognuno dei quali può essere sostituito da qualsiasi file di progetto per eseguire azioni personalizzate. Quindi è del tutto possibile per qualcuno scavalcare la ricostruzione per fare diverse azioni prima di iniziare un clean + build (o rimuoverle del tutto).

Molto un caso d'angolo, ma sottolineando a causa di discussioni di commento.


Se aggiungi azioni di compilazione che spostano i file DLL in una nuova posizione, puoi ottenere risultati di compilazione "errati" semplicemente eseguendo una ricostruzione. Se mescoli un progetto vb.net e un progetto c # le cose peggiorano ulteriormente, i progettisti di moduli non funzionanti e nessun goto funzionante.
CodingBarfield

1 Si noti inoltre che Ricostruisci comportamento non sembra essere coerente in lingue rispetto alle dipendenze: stackoverflow.com/questions/12163080/...
lesscode

1
Il 99% delle volte è ampiamente sopravvalutato.
Rhyous,

58

Definiamo l'implementazione Rebuild predefinita in termini di implementazioni Clean and Build predefinite:

  1. Per progetto: ricostruzione del progetto = progetto pulito + progetto di costruzione.

  2. Per soluzione: ricostruire sln = foreach project in sln (Clean project + Build project).

Si noti che a causa delle differenze nell'ordine di esecuzione, Ricostruisci sln non è lo stesso di (Clean sln + Build sln) = (foreach project in sln Clean project) + (foreach project in sln Build project). Inoltre, questo "foreach" può essere eseguito contemporaneamente, quindi è possibile eseguire contemporaneamente attività diverse nei due scenari.

Supponi di avere uno sln che contiene proj1, proj2 e proj3.

  • Ricostruisci sln = (Clean proj1 + Build proj1) & (Clean proj2 + Build proj2) & (Clean proj3 + Build proj3)

  • Clean Sln + Build Sln = (Clean proj1 & Clean proj2 & Clean proj3) + (Build proj1 & Build proj2 & Build proj3)

+ significa seriale e significa simultaneo.

Quindi, se le dipendenze del progetto non sono configurate correttamente, c'è la possibilità che quando esegui Rebuild sln, alcuni dei tuoi progetti si colleghino a una libreria non aggiornata. Questo perché non è garantito il completamento di tutte le pulizie prima dell'inizio della prima generazione. Se esegui Clean sln + Build sln, visualizzeranno un errore di collegamento e ti informeranno immediatamente, invece di darti un'app con un comportamento strano.


7
Questa è la risposta più esatta, poiché spiega perché a volte non potevo ricostruire, ma ero in grado di pulire + costruire.
Toan Nguyen il

11

Da http://www.cs.tufts.edu/r/graphics/resources/vs_getting_started/vs_getting_started.htm , (basta cercarlo su Google):

Build significa compilare e collegare solo i file di origine che sono stati modificati dall'ultima build, mentre Rebuild significa compilare e collegare tutti i file di origine indipendentemente dal fatto che siano stati modificati o meno. Costruire è la cosa normale da fare ed è più veloce. A volte le versioni dei componenti di destinazione del progetto possono non essere sincronizzate e la ricostruzione è necessaria per il successo della compilazione. In pratica, non hai mai bisogno di pulire.

Build o Rebuild Solution crea o ricostruisce tutti i progetti nella tua soluzione, mentre Build o Rebuild costruisce o ricostruisce il progetto StartUp, "ciao" nella schermata sopra. Per impostare il progetto StartUp, fare clic con il tasto destro sul nome del progetto desiderato nella scheda Esplora soluzioni e selezionare Imposta come progetto StartUp. Il nome del progetto ora appare in grassetto. Poiché le soluzioni per i compiti a casa hanno generalmente un solo progetto, Build or Rebuild Solution è effettivamente lo stesso di Build o Rebuild.

Compilare semplicemente compila il file sorgente attualmente in fase di modifica. Utile per verificare rapidamente la presenza di errori quando il resto dei file di origine è in uno stato incompleto che impedirebbe una corretta compilazione dell'intero progetto. Ctrl-F7 è il tasto di scelta rapida per la compilazione.


Come Toan Nguyen, ho sperimentato che a volte Clean + Build Solution riesce dove una soluzione Rebuild fallisce (probabilmente a causa di dipendenze tra progetti), quindi questa risposta è fuorviante, almeno nel 2018.
Jon Coombs,

4

Da questo post sul blog che l'autore ha collegato come commento a questa domanda :

In realtà no !!! non sono uguali.

La differenza sta nella sequenza che i progetti vengono ripuliti e compilati. Diciamo che abbiamo due progetti in una soluzione. Clean and then build eseguirà clean per entrambi i progetti e quindi build avverrà singolarmente mentre il progetto A verrà ricostruito e verrà pulito, quindi build dopo quel progetto B sarà pulito e quindi build e così via.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.