Как новый вариант предварительной компиляции во время публикации влияет на приложения MVC4?


86

Поэтому я недавно обновил Visual Studio 2012 до обновления 2. И вот, в следующий раз, когда я собираюсь опубликовать свое приложение (в данном случае через File Publish), я замечаю, что есть три новых варианта:

  1. Удалите все существующие файлы перед публикацией
  2. Прекомпилировать во время публикации (со ссылкой на Настроить)
  3. Исключить файлы из папки App_Data

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


Расположение функции может быть новым, но сама функция - нет. Даже если это не касается компиляции MVC, WebForms могут взаимодействовать в проекте MVC.
— Грант Томас

Ответы:


85

Использование прекомпилятора ASP.NET может оказать следующее влияние на ваше приложение MVC:

  • Если у вас есть что-то в App_Code, оно будет предварительно скомпилировано в DLL перед развертыванием. Без предварительной компиляции это могло бы происходить "на лету" средой выполнения ASP.NET.
  • Если вы выбираете опцию не сделать ваши страницы обновляемыми (т.е. снимите первый флажок в диалоговом окне дополнительных настроек), он будет также Прекомпилировать просмотры (ASPX и Razor) вместо компиляции тех динамически во время выполнения , а также. Параметр по умолчанию (установлен флажок) «Разрешить обновлять предварительно скомпилированный сайт» позволяет обновлять содержимое представления без необходимости перестраивать весь проект.

Если у вас нет файлов в App_Code, и вы хотите, чтобы ваш сайт оставался обновляемым, похоже, это мало что дает.


7
@Elsimer Ваши файлы .cshtml по-прежнему будут существовать, но если их содержимое предварительно скомпилировано, вы обнаружите, что их содержимое заменено на «Это файл-маркер, созданный инструментом предварительной компиляции, и его не следует удалять!».
— Джимми

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

16
Дополнительным преимуществом того, что ваши страницы НЕ обновляются, является то, что 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.