Как отключить предварительно скомпилированные представления в net core 2.1+/net 5 для отладки?

Вчера обновился до net core 2.1.

Теперь, если я отлаживаю, представления предварительно компилируются, что, конечно, занимает много времени при запуске... Можно ли вернуться к предыдущему поведению, когда представления компилируются как раз вовремя, если это необходимо?

Выход

У меня нет ссылки на предварительную компиляцию в моем csproj. Это что-то из метапакета?

  <ItemGroup>
    <PackageReference Include="JetBrains.Annotations" Version="11.1.0" />
    <PackageReference Include="Microsoft.AspNetCore.All" Version="2.1.0" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="2.1.0" PrivateAssets="All" />
    <PackageReference Include="Swashbuckle.AspNetCore" Version="2.5.0" />
    <!--<PackageReference Include="Microsoft.AspNetCore.Mvc.Razor.ViewCompilation" Version="2.0.0" PrivateAssets="All" />-->
  </ItemGroup>

person Christian Gollhardt    schedule 09.06.2018    source источник
comment
Привет, мне интересно, знаете ли вы, где хранятся скомпилированные представления? Заранее спасибо.   -  person Örvar    schedule 02.11.2018
comment
Это обычные классы, включенные в Views.dll. Вы можете показать, что находится в dll, с помощью таких инструментов, как dotPeek @Örvar   -  person Christian Gollhardt    schedule 02.11.2018


Ответы (5)


.net core ›= 3 (также называется .net 5)

Microsoft создала пакет Nuget. Это задокументировано здесь.

Просто укажите Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation в своем .csproj< /em> файл условно. Не забудьте настроить версию, которой вы действительно пользуетесь.

<PackageReference
    Include="Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation"
    Version="3.1.0"
    Condition="'$(Configuration)' == 'Debug'" />

Также настройте свои услуги

    public void ConfigureServices(IServiceCollection services)
    {
        // your MVC Builder (AddRazorPages/AddControllersWithViews)
        IMvcBuilder builder = services.AddRazorPages();

#if DEBUG
            // Only use Runtime Compilation on Debug
            if (Env.IsDevelopment())
            {
                builder.AddRazorRuntimeCompilation();
            }
#endif
    }

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

ядро .net ›= 2.1 && ‹ 3

Этого можно добиться с помощью свойства RazorCompileOnBuild в файле .csproj:

<PropertyGroup>
  <TargetFramework>netcoreapp2.1</TargetFramework>
  <RazorCompileOnBuild>false</RazorCompileOnBuild>
  <RazorCompileOnPublish>true</RazorCompileOnPublish>
</PropertyGroup>

Таким образом, файлы Razor предварительно компилируются только во время публикации.

В зависимости от варианта использования вы также можете настроить это в зависимости от конфигурации сборки:

<PropertyGroup Condition="'$(Configuration)' == 'Debug'">
  <RazorCompileOnBuild>false</RazorCompileOnBuild>
  <RazorCompileOnPublish>true</RazorCompileOnPublish>
</PropertyGroup>
person Christian Gollhardt    schedule 10.06.2018
comment
Использование этого параметра в режиме отладки довольно удобно, поскольку время до первого рендеринга остается примерно таким же, а F5 в браузере для обновления после изменения cshtml НАМНОГО быстрее. Но при таком подходе к настройке F1 в VS 2017 больше не заставляет мои связанные браузеры обновляться, вместо этого VS выводит диалоговое окно с надписью «Вы хотите остановить отладку». Как-то странно. Какие-нибудь мысли? - person RonC; 27.07.2018
comment
Для .Net Core 3.x вам необходимо установить расширение NuGet из MS docs.microsoft.com/en-us/aspnet/core/mvc/views/ — обратите внимание, что свойство ENV необходимо добавить в конструктор запуска в качестве параметра DI ( согласно комментарию внизу страницы) - person Rob; 25.02.2020
comment
Большое спасибо, я использую asp.net core 2.1, и ваше решение для .net core ›= 2.1 && ‹ 3 работает. - person Irfan Ashraf; 19.04.2020
comment
@Christian - я добавил Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation в свой проект ASP.NET MVC Core 3 и добавил services.AddRazorPages().AddRazorRuntimeCompilation(); в Startup. Когда я публикую, должен ли я видеть свои файлы .cshtml непосредственно на сервере? Я пытаюсь включить сценарий, в котором люди, работающие с html/css, могут работать со мной без необходимости иметь среду Microsoft. - person Howiecamp; 05.10.2020
comment
@Howiecamp это отвечает на ваш вопрос? - person Christian Gollhardt; 05.10.2020
comment
RazorCompileOnBuild=false не работает с ядром aspnet 5.0, помогите - person ahdung; 15.12.2020
comment
Вы пробовали › 3 версию? @ahdung - person Christian Gollhardt; 15.12.2020
comment
@ChristianGollhardt Я использую .NET 5, после перехода на core3.1 та же проблема. Pages папка не в bin/debug. - person ahdung; 15.12.2020
comment
Если у вас есть новый вопрос, пожалуйста, задайте его. Этот вопрос не о публикации @ahdung - person Christian Gollhardt; 15.12.2020

Вы должны установить для MvcRazorCompileOnPublish значение false, при этом он отключит все функции компиляции представления, которые включены как часть публикации.

<PropertyGroup>
  <MvcRazorCompileOnPublish>false</MvcRazorCompileOnPublish>
</PropertyGroup>
person Nedzad G    schedule 09.06.2018

Вы можете играть с MvcRazorFilesToCompile собственностью проекта

MvcRazorFilesToCompile: группа элементов, указывающая файлы представлений для компиляции. По умолчанию сюда входят все файлы .cshtml, помеченные как содержимое.

Примечание. Не используйте пустую строку, так как она аналогична строке по умолчанию (из репозитория):

<ItemGroup Condition="'@(MvcRazorFilesToCompile)' == ''">
      <MvcRazorFilesToCompile Include="@(Content)" Condition="'%(Extension)'=='.cshtml'" />
</ItemGroup>
person Set    schedule 10.06.2018

Если вы используете ControllersWithViews в .net core 3.1 или .net core 5.0, вы можете посмотреть на следующее решение:

Отключить предварительно скомпилированные представления при разработке при использовании AddControllersWithViews()

person serhattsnmz    schedule 19.01.2021

Из По переходу с ASP.NET Core 1.x на 2.0 вам потребуется установить для параметра MvcRazorCompileOnPublish значение false.

person Mark G    schedule 09.06.2018
comment
Я перешел с 2.0 на 2.1. Тем не менее, этот вариант предназначен для публикации. Меня беспокоит отладка. - person Christian Gollhardt; 10.06.2018
comment
Кажется, вы отклонили ответ, даже не попробовав его. Если вы удалите Conversiolt.Conmania.Views.dll и добавите этот флаг, он будет воссоздан в папке отладки? - person Mark G; 10.06.2018
comment
Это вообще отключает его. Как тогда включить его во время публикации? - person Christian Gollhardt; 10.06.2018
comment
Взгляните на ASP.NET Core Razor SDK для некоторых параметров. - person Mark G; 10.06.2018