Компилировать представления в ASP.NET MVC
Я хочу, чтобы задача msbuild компилировала представления, чтобы я мог видеть, есть ли ошибки времени компиляции во время... компиляции. Есть идеи?
9 ответов
Честно говоря, я бы рекомендовал пакет RazorGenerator nuget. Таким образом, ваши взгляды имеют .designer.cs
файл, сгенерированный при их сохранении и в дополнение к получению ошибок времени компиляции для ваших представлений, они также предварительно скомпилированы в сборку (= более быстрый прогрев), и Resharper также предоставляет некоторую дополнительную помощь.
Чтобы использовать это, включите пакет nuget RazorGenerator в свой проект ASP.NET MVC и установите расширение " Razor Generator " в пункте " Инструменты" → "Расширения и обновления".
Мы используем это, и издержки на компиляцию при таком подходе намного меньше. Вдобавок ко всему, я бы, вероятно, порекомендовал .NET Demon от RedGate, что еще больше существенно снижает влияние времени компиляции.
Надеюсь это поможет.
Из документа readme word doc для RC1 (не индексируется Google)
Шаг посткомпиляции компилятора ASP.NET
В настоящее время ошибки в файле представления не обнаруживаются до времени выполнения. Чтобы позволить вам обнаруживать эти ошибки во время компиляции, проекты ASP.NET MVC теперь включают свойство MvcBuildViews, которое по умолчанию отключено. Чтобы включить это свойство, откройте файл проекта и установите для свойства MvcBuildViews значение true, как показано в следующем примере:
<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<MvcBuildViews>true</MvcBuildViews>
</PropertyGroup>
Примечание. Включение этой функции увеличивает время сборки.
Вы можете обновить проекты, созданные в предыдущих выпусках MVC, чтобы включить проверку представлений во время сборки, выполнив следующие действия:
- Откройте файл проекта в текстовом редакторе.
- Добавьте следующий элемент под самый верхний
<PropertyGroup>
элемент:<MvcBuildViews>true</MvcBuildViews>
- В конце файла проекта раскомментируйте
<Target Name="AfterBuild">
элемент и измените его, чтобы соответствовать следующему:
<Target Name="AfterBuild" Condition="'$(MvcBuildViews)'=='true'">
<AspNetCompiler VirtualPath="temp" PhysicalPath="$(ProjectDir)\..\$(ProjectName)" />
</Target>
Вы можете использовать aspnet_compiler для этого:
C:\Windows\Microsoft.NET\Framework\v2.0.50727\aspnet_compiler -v /Virtual/Application/Path/Or/Path/In/IIS/Metabase -p C:\Path\To\Your\WebProject -f -errorstack C:\Where\To\Put\Compiled\Site
где "/ Virtual / Application / Path / Or / Path / In / IIS / Metabase" выглядит примерно так: "/ MyApp" или "/ lm / w3svc2 / 1 / root /"
Также на MSDN есть задача AspNetCompiler, показывающая, как интегрировать aspnet_compiler с MSBuild:
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="PrecompileWeb">
<AspNetCompiler
VirtualPath="/MyWebSite"
PhysicalPath="c:\inetpub\wwwroot\MyWebSite\"
TargetPath="c:\precompiledweb\MyWebSite\"
Force="true"
Debug="true"
/>
</Target>
</Project>
Кроме того, если вы используете Resharper, вы можете активировать Solution Wide Analysis, и он обнаружит любые ошибки компилятора, которые могут возникнуть в файлах aspx. Это то, что мы делаем...
В следующем выпуске ASP.NET MVC (который выйдет в январе или около того) должна быть задача MSBuild, которая компилирует представления, так что вы можете подождать.
Посмотреть объявление
Ответ, данный здесь, работает для некоторых версий MVC, но не для других.
Простое решение работало для MVC1, но при обновлении до MVC2 представления больше не компилировались. Это было связано с ошибкой в файлах проекта сайта. Смотрите эту взломанную статью.
Смотрите это: http://haacked.com/archive/2011/05/09/compiling-mvc-views-in-a-build-environment.aspx
Построить> Выполнить анализ кода
Горячая клавиша: Alt+F11
Помогли мне ловить бритвенные ошибки.
Использование расширения Power Tools (бесплатно) для Visual Studio немного помогает. В частности, Solution Error Visualizer
особенность. При этом ошибки компиляции отмечаются визуально в обозревателе решений (в исходном файле, где была обнаружена ошибка). Однако по какой-то причине эта функция не работает, как с другими ошибками где-либо еще в коде.
В представлениях MVC любые ошибки во время компиляции будут по-прежнему подчеркнуты красным в соответствующих файлах.cs, но сигнализация об этих ошибках не распространяется вверх в обозревателе решений (ни в коем случае, даже в исходном файле, в котором они содержатся).
Спасибо BlueClouds
для исправления моего предыдущего заявления.
Я только что сообщил об этом как о проблеме в проекте расширения github.
Если у вас есть несколько веб-проектов с представлениями MVC в решении и большим количеством представлений MVC, их создание может удвоить общее время сборки. По крайней мере, это случилось со мной.
В MSBuild есть функция, называемая , которую можно использовать, чтобы сообщить msbuild избегать повторного создания представлений, если изменений нет.
Цитата из инкрементными сборкамидокументации гласит:
Чтобы включить инкрементальные сборки (сборки, в которых перестраиваются только те целевые объекты, которые не были построены ранее, или устаревшие целевые объекты), Microsoft Build Engine (MSBuild) может сравнивать временные метки входных файлов с временными метками выходных файлов. файлы и определить, следует ли пропустить, построить или частично перестроить цель.
Нам просто нужно предоставить входы и выходы. В качестве входных данных мы можем использовать наши представления, а для вывода мы можем сгенерировать пустой файл где-нибудь в папке obj.
Нам также необходимо не забыть очистить выходной файл при запуске Cleanup.
Следующий код может это сделать:
<PropertyGroup>
<BuildDependsOn>
$(BuildDependsOn);
BuildMvcViews;
</BuildDependsOn>
<BuildMvcViewsCacheFile>$(IntermediateOutputPath)$(MSBuildProjectFile).BuildMvcViews.cache</BuildMvcViewsCacheFile>
</PropertyGroup>
<ItemGroup>
<BuildMvcViewsInputs Include="$(ProjectDir)Views\**\*.cshtml"></BuildMvcViewsInputs>
</ItemGroup>
<Target Name="BuildMvcViews" Inputs="@(BuildMvcViewsInputs)" Outputs="$(BuildMvcViewsCacheFile)">
<AspNetCompiler VirtualPath="temp" PhysicalPath="$(ProjectDir)" Condition="'@(BuildMvcViewsInputs)' != ''"/>
<WriteLinesToFile
File="$(BuildMvcViewsCacheFile)"
Lines=""
Overwrite="true"
Condition="'@(BuildMvcViewsInputs)' != ''"/>
</Target>
<PropertyGroup>
<CleanDependsOn>
$(CleanDependsOn);
CleanBuildMvcViewsCacheFile;
</CleanDependsOn>
</PropertyGroup>
<Target Name="CleanBuildMvcViewsCacheFile">
<Delete Files="$(BuildMvcViewsCacheFile)" />
</Target>
Дополнительная информация в моем сообщении в блоге: https://www.bartlomiejmucha.com/en/blog/msbuild/how-to-optimize-build-times-for-mvc-views.