MvcBuildViews в MS2015 занимает много времени

Мы конвертируем решение для использования нового компилятора Roslyn. Когда я создаю его через teamCity в режиме выпуска, на этапе MVCBuildViews по-прежнему используется aspnet_compiler.exe, и предварительная компиляция представлений занимает около 15 минут. Тот же процесс занимал 3 минуты при использовании предыдущей версии aspnet_compiler.exe в .NET 4.5.

Это команда, которая требует времени:

C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ aspnet_compiler.exe -v temp -p E: \ path \ to \ web \ project \ Directory

Я попытался настроить параметры MSBuild, но ничего не изменилось. Это известная проблема, есть ли какие-нибудь решения? Нужно ли предварительно скомпилировать представление с помощью Roslyn? каков недостаток отключения шага MVCBuildViews, если это вариант (я считаю, что наш выбор предварительной компиляции при выпуске является причиной запуска этого шага).


person delloPiro    schedule 11.02.2016    source источник


Ответы (1)


Мы столкнулись с той же проблемой в Stack Overflow, поэтому мы создали StackExchange.Precompilation. Вы можете прочитать об этом в нашем объявлении в блоге, но вот некоторые кровавые технические подробности, поскольку мы, естественно, исследовали, почему aspnet_compiler.exe работает так медленно, прежде чем написать для него собственную замену.

aspnet_compiler.exe существует задолго до того, как asp .net-mvc и razor, и, конечно же, он поддерживает такие вещи, как пакетная компиляция через <compilation batch="true" />. Однако для того, чтобы представление было скомпилировано, сначала необходимо преобразовать шаблон CSHTML в C # (CodeDOM). К сожалению, это не компиляция как таковая, поэтому batch="true" к ней не применяется. (не-) По сути, просмотры обрабатываются последовательно, по одному за раз. И любые функции roslyn, которые вы добавляете поверх него, только замедляют его, поскольку в какой-то момент должно быть преобразование CodeDOM -> roslyn.

Вот хорошая трассировка стека того, что происходит перед пакетной компиляцией в aspnet_compiler.exe.

aspnet_compiler.exe цикл foreach

Обратите внимание на этот вызов AddBuildProvider (который вызывает GenerateCode) уже находится внутри двух foreach циклов. Я полагаю, что параметры batch="true" были эффективны только для ускорения компиляции App_Code в проектах веб-сайтов ...

Вот что впоследствии произошло с нашими временами сборки:

введите описание изображения здесь

Я бы не рекомендовал отключать предварительную компиляцию всем, кто запускает приложение ASP.NET MVC в производственной среде.

  • Наиболее очевидным аргументом в пользу этого является то, что он подтверждает, что вы просматриваете код. В противном случае вы обмениваете ошибки времени компиляции на сервере сборки на ошибки времени выполнения в производственной среде.
  • Другой аргумент в пользу этого - производительность. Ваши представления должны быть скомпилированы в какой-то момент, и если этого не происходит во время компиляции, первые несколько пользователей, которые попадают на ваш сайт, должны снова подождать в рабочей среде.
person m0sa♦    schedule 14.03.2016
comment
Спасибо! Я изучу StackExchange.Precompilation. И поделитесь любыми отзывами. Слава вам, ребята из StackExchange, за отличную работу, которую вы делаете. - person delloPiro; 14.03.2016