Який ефект нова попередня компіляція під час публікації впливає на програми MVC4?


85

Тож нещодавно я оновив Visual Studio 2012 до оновлення 2. Ось ось, наступного разу, коли я піду опублікувати свою програму (у цьому випадку через File Publish), я помічаю, що є три нові варіанти:

  1. Видаліть усі наявні файли перед публікацією
  2. Попередня компіляція під час публікації (із посиланням на Налаштування)
  3. Виключіть файли з папки App_Data

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


Розташування функції може бути новим, але сама функція - ні. Навіть якщо це не стосувалося компіляції MVC, WebForms сумісні в проекті MVC.
Грант Томас

Відповіді:


84

Використання попереднього компілятора ASP.NET може мати такий вплив на ваш додаток MVC:

  • Якщо у вас є щось у App_Code, воно буде попередньо скомпільовано в DLL перед розгортанням. Без попередньої компіляції це могло б відбуватися на льоту під час виконання ASP.NET.
  • Якщо ви виберете опцію не робити ваші сторінки оновлюваними (тобто зніміть перший прапорець у діалоговому вікні розширених налаштувань), він також попередньо скомпілює ваші представлення (ASPX та Razor), замість того, щоб динамічно компілювати їх під час виконання. Параметр за умовчанням (позначений) "Дозволити попередньо скомпільований сайт оновлюватися" дозволяє оновити вміст вашого перегляду без необхідності перебудовувати весь проект.

Якщо у вас немає файлів у App_Code, і ви хочете, щоб ваш сайт залишався оновлюваним, це, здається, не робить багато.


7
@Elsimer Ваші .cshtml-файли все ще існуватимуть, але якщо їх вміст буде попередньо скомпільовано, їх вміст буде замінено на "Це файл-маркер, створений інструментом попередньої компіляції, і його не слід видаляти!".
Джиммі

4
Крім того, підвищення ефективності в основному відбувається при початковому запуску сайту, коли компілятор викликається динамічно для кожної сторінки. Після того, як сторінку вдарили один раз (і скомпілювали), цей результат компіляції буде використовуватися при наступних завантаженнях сторінки, навіть якщо ви не скомпілювали попередньо.
Джиммі

15
Додатковою перевагою того, що НЕ можна оновлювати ваші сторінки, є те, що VS виявить помилки типу у ваших поданнях, перш ніж вони потраплять на ваш веб-сайт.
Кріс

4
@Chris, вам слід переглянути свою стратегію тестування, якщо такі помилки залишаться невловимими без опції попередньої компіляції.
user247702

2
@ AndersLindén: Просто протестуйте фактично надану відповідь ваших дій контролера. Це викликає Razor, і якщо воно генерує виняток, це не пройде ваш тест. Однак саме тому ваші погляди повинні бути дуже легкими щодо коду. Ви не можете виконати дрібнозернисте модульне тестування коду перегляду, як це можна зробити в класі. Це майже просто або пройти, або провалити, і навіть тоді, проходження просто означає, що не породило жодних винятків, а не те, що насправді зробило те, що повинно було.
Кріс Пратт,

0

Це давнє запитання, але я просто стикаюся з подібною проблемою і відчуваю, чим варто поділитися.

Моє повідомлення про помилку є таким самим у цій публікації. Мій проект - MVC5, побудований за допомогою Visual Studio 2013 professional. Помилка компіляції: Тип 'ASP.global_asax' існує в обох бібліотеках DLL

У моєму випадку, з можливістю попередньої компіляції, у папці bin є файл App_global.asax.dll, і вище з’являється повідомлення про помилку. Спочатку я видаляю App_global.asax.dll на сервері, перезапускаю пул програм, проблема зникла. Потім я спробував інший підхід, зніміть прапорець перед компіляцією та повторною публікацією, перерозподіліть на сервер, проблема зникла.

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