Как новый вариант предварительной компиляции во время публикации влияет на приложения 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 на сервере, перезапускаю пул приложений, проблема исчезла. Затем я попробовал другой подход, снял флажок с предварительной компиляции и повторной публикации, повторно развернул на сервер, проблема исчезла.

гибкий поток
источник