Che effetto ha la nuova opzione di precompilazione durante la pubblicazione sulle applicazioni MVC4?


86

Quindi ho recentemente aggiornato Visual Studio 2012 all'aggiornamento 2. Ed ecco, la prossima volta che vado a pubblicare la mia applicazione (tramite File Publish in questo caso) ho notato che ci sono tre nuove opzioni:

  1. Elimina tutti i file esistenti prima della pubblicazione
  2. Precompila durante la pubblicazione (con un collegamento a Configura)
  3. Escludi file dalla cartella App_Data

La prima e la terza opzione sono piuttosto autoesplicative, ma non riesco a trovare alcuna documentazione sulla seconda opzione in quanto si applica a MVC. Quando lo controllo, non sembra esserci alcun cambiamento nei file prodotti sul sito e non vedo alcun cambiamento reale nelle prestazioni.


La posizione della funzione potrebbe essere nuova, ma la funzione stessa non lo è. Anche se non riguardava la compilazione di MVC, i WebForm sono interoperabili in un progetto MVC.
Grant Thomas

Risposte:


85

L'uso del precompilatore ASP.NET può avere il seguente impatto sulla tua app MVC:

  • Se hai qualcosa in App_Code, verrà precompilato in una DLL prima della distribuzione. Senza la precompilazione, ciò avverrebbe al volo dal runtime ASP.NET.
  • Se scegli l'opzione per non rendere le tue pagine aggiornabili (cioè deseleziona la prima casella di controllo nella finestra di dialogo delle impostazioni avanzate), precompilerà anche le tue viste (ASPX e Razor) invece di compilare quelle dinamicamente anche a runtime. L'impostazione predefinita (selezionata) di "Consenti l'aggiornamento del sito precompilato" consente di aggiornare il contenuto della visualizzazione senza dover ricostruire l'intero progetto.

Se non hai alcun file in App_Code e desideri che il tuo sito rimanga aggiornabile, non sembra fare molto.


7
@Elsimer I tuoi file .cshtml continueranno a esistere, ma se il loro contenuto è precompilato, troverai il loro contenuto sostituito con "Questo è un file marker generato dallo strumento di precompilazione e non dovrebbe essere cancellato!".
Jimmy

4
Inoltre, i guadagni in termini di prestazioni sono principalmente all'avvio del sito iniziale, quando il compilatore viene richiamato dinamicamente per ogni pagina. Una volta che la pagina è stata raggiunta una volta (e compilata), il risultato della compilazione verrà utilizzato nei successivi caricamenti della pagina anche se non è stato precompilato.
Jimmy

16
Un ulteriore vantaggio di NON avere le tue pagine aggiornabili è che VS troverà errori di tipo nelle tue visualizzazioni prima che arrivino al tuo sito live.
Chris

4
@ Chris dovresti riconsiderare la tua strategia di test se tali errori non dovessero essere rilevati senza l'opzione di precompilazione.
user247702

2
@ AndersLindén: prova solo l'effettiva risposta di rendering delle azioni del controller. Ciò richiamerà Razor e se genera un'eccezione, il test non verrà superato. Tuttavia, questo è anche il motivo per cui le tue opinioni dovrebbero essere molto chiare sul codice. Non puoi davvero eseguire test di unità a grana fine sul codice di visualizzazione come puoi fare in una classe. È praticamente solo passare o fallire, e anche allora, passare significa semplicemente che non ha generato eccezioni, non che in realtà ha fatto quello che avrebbe dovuto.
Chris Pratt

0

È una vecchia domanda, ma ho appena incontrato un problema simile e sento qualcosa che vale la pena condividere.

Il mio messaggio di errore è lo stesso in questo post. Il mio progetto è MVC5, costruito con Visual Studio 2013 professional. Errore di compilazione: il tipo "ASP.global_asax" esiste in entrambe le DLL

Nel mio caso, con l'opzione di precompilazione, c'è un file, App_global.asax.dll, nella cartella bin e causa il messaggio di errore sopra. Innanzitutto, rimuovo App_global.asax.dll sul server, riavvio il pool di applicazioni, il problema è scomparso. Quindi ho provato un altro approccio, deseleziona precompila e ripubblica, ridistribuisci sul server, il problema è sparito.

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.