Jaki wpływ ma nowa opcja prekompilacji podczas publikowania na aplikacje MVC4?

85

Niedawno zaktualizowałem Visual Studio 2012 do Update 2. Lo i oto, kiedy następnym razem będę publikować moją aplikację (w tym przypadku przez File Publish), zauważyłem, że są trzy nowe opcje:

  1. Usuń wszystkie istniejące pliki przed opublikowaniem
  2. Prekompiluj podczas publikowania (z linkiem do konfiguracji)
  3. Wyklucz pliki z folderu App_Data

Pierwsza i trzecia opcja są dość oczywiste, ale nie mogę znaleźć żadnej dokumentacji na temat drugiej opcji, ponieważ dotyczy ona MVC. Kiedy to sprawdzam, wydaje się, że nie ma żadnej zmiany w plikach tworzonych na stronie i nie widzę żadnej rzeczywistej zmiany w wydajności.

Elsimer
źródło
Lokalizacja funkcji może być nowa, ale sama funkcja nie. Nawet jeśli nie dotyczy to kompilacji MVC, formularze internetowe są interoperacyjne w projekcie MVC.
Grant Thomas

Odpowiedzi:

84

Użycie prekompilatora ASP.NET może mieć następujący wpływ na aplikację MVC:

  • Jeśli masz cokolwiek w App_Code, zostanie to wstępnie skompilowane do biblioteki DLL przed wdrożeniem. Bez prekompilacji mogłoby to nastąpić w locie przez środowisko wykonawcze ASP.NET.
  • Jeśli wybierzesz opcję, aby nie aktualizować swoich stron (tj. Usuniesz zaznaczenie pierwszego pola wyboru w oknie ustawień zaawansowanych), spowoduje to również prekompilację widoków (ASPX i Razor), zamiast kompilować je również dynamicznie w czasie wykonywania. Domyślne (zaznaczone) ustawienie „Zezwalaj na aktualizację prekompilowanej witryny” umożliwia aktualizację zawartości widoku bez konieczności przebudowywania całego projektu.

Jeśli nie masz żadnych plików w App_Code i chcesz, aby Twoja witryna pozostała aktualizowalna, wydaje się, że nie robi to wiele.

Jimmy
źródło
7
@Elsimer Twoje pliki .cshtml będą nadal istnieć, ale jeśli ich zawartość zostanie wstępnie skompilowana, ich zawartość zostanie zastąpiona tekstem „To jest plik znacznika wygenerowany przez narzędzie prekompilacji i nie należy go usuwać!”.
Jimmy
4
Ponadto wzrost wydajności występuje głównie przy pierwszym uruchomieniu witryny, kiedy kompilator jest wywoływany dynamicznie dla każdej strony. Gdy strona została raz trafiona (i skompilowana), ten wynik kompilacji zostanie użyty przy kolejnych ładowaniach strony, nawet jeśli nie została ona wstępnie skompilowana.
Jimmy
15
Dodatkową korzyścią z braku możliwości aktualizacji stron jest to, że VS znajdzie błędy typu w Twoich widokach, zanim trafią one do Twojej aktywnej witryny.
Chris
4
@Chris, powinieneś ponownie przemyśleć swoją strategię testowania, jeśli takie błędy nie zostałyby złapane bez opcji prekompilacji.
user247702
2
@ AndersLindén: Po prostu przetestuj rzeczywistą wyrenderowaną odpowiedź akcji kontrolera. Spowoduje to wywołanie Razora i jeśli wygeneruje wyjątek, zakończy się niepowodzeniem. Jednak jest to również powód, dla którego twoje poglądy powinny być bardzo lekkie na kod. Nie można naprawdę przeprowadzić drobnoziarnistych testów jednostkowych w kodzie widoku, tak jak w przypadku klasy. Prawie po prostu zdaje się lub nie, a nawet wtedy przejście oznacza po prostu, że nie wygenerowało żadnych wyjątków, a nie że faktycznie zrobiło to, co powinno.
Chris Pratt,
0

To stare pytanie, ale po prostu napotykam podobny problem i czuję, że warto się nim podzielić.

Mój komunikat o błędzie jest taki sam w tym poście. Mój projekt to MVC5, skompilowany w Visual Studio 2013 Professional. Błąd kompilacji: typ „ASP.global_asax” istnieje w obu bibliotekach DLL

W moim przypadku, z opcją prekompilacji, w folderze bin znajduje się plik App_global.asax.dll i powoduje powyższy komunikat o błędzie. Najpierw usuwam App_global.asax.dll na serwerze, restartuję pulę aplikacji, problem zniknął. Potem spróbowałem innego podejścia, odznaczyłem prekompilację i ponowną publikację, przeprowadź ponowne wdrożenie na serwerze, problem zniknął.

flexflow
źródło