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

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

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

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

У меня нет ссылки на предварительную компиляцию в моем 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>

Привет, мне было интересно, знаете ли вы, где хранятся скомпилированные представления? Заранее спасибо.

Örvar 02.11.2018 09:19

Это просто обычные классы, включенные в Views.dll. Вы можете показать, что находится в dll, с помощью таких инструментов, как dotPeek @ Örvar

Christian Gollhardt 02.11.2018 09:33
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
23
2
12 604
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

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

Я перешел с 2.0 на 2.1. Тем не менее, этот вариант предназначен / был для публикации. Меня беспокоит отладка.

Christian Gollhardt 09.06.2018 23:12

Кажется, вы отклонили ответ, даже не попробовав его. Если вы удалите Conversiolt.Conmania.Views.dll и добавите этот флаг, будет ли он воссоздан в папке отладки?

Mark G 09.06.2018 23:38

Это обычно отключает его. Как тогда включить его при публикации?

Christian Gollhardt 09.06.2018 23:43

Взгляните на Пакет SDK для Razor ASP.NET Core для некоторых опций.

Mark G 10.06.2018 00:04

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

<PropertyGroup>
  <MvcRazorCompileOnPublish>false</MvcRazorCompileOnPublish>
</PropertyGroup>
Посмотри это
Christian Gollhardt 09.06.2018 23:15

Я думаю, что сейчас нет хорошего способа сделать это, вам нужно найти обходной путь здесь. См. github.com/aspnet/MvcPrecompilation/issues/39.

Nedzad G 09.06.2018 23:43

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

MvcRazorFilesToCompile: item group that specifies view files to compile. By default this includes all .cshtml files marked as content.

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

<ItemGroup Condition = "'@(MvcRazorFilesToCompile)' == ''">
      <MvcRazorFilesToCompile Include = "@(Content)" Condition = "'%(Extension)'=='.cshtml'" />
</ItemGroup>
Ответ принят как подходящий

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

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

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

<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
    }

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

.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>

Использование этого параметра в режиме отладки довольно круто, поскольку время для первого рендеринга остается примерно таким же, а F5 в браузере для обновления после изменения cshtml НАМНОГО быстрее. Но при таком подходе к настройке F1 в VS 2017 больше не вызывает обновления моих связанных браузеров, вместо этого VS выводит диалоговое окно, в котором говорится: «Вы хотите остановить отладку. Как-то странно. Есть мысли?

RonC 27.07.2018 20:17

Для .Net Core 3.x вам необходимо установить расширение NuGet из MS docs.microsoft.com/en-us/aspnet/core/mvc/views/… - обратите внимание, что свойство «ENV» необходимо добавить в конструктор запуска в качестве параметра DI (согласно комментарию внизу страницы)

Rob 25.02.2020 11:55

Большое спасибо, я использую asp.net core 2.1, и ваше решение для .net core> = 2.1 && <3 работает.

Irfan Ashraf 19.04.2020 08:14

@Christian - Я добавил Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation в свой проект ASP.NET MVC Core 3 и добавил services.AddRazorPages().AddRazorRuntimeCompilation(); в Startup. Должен ли я видеть свои файлы .cshtml непосредственно на сервере при публикации? Я пытаюсь включить сценарий, в котором люди html / css могут работать со мной без необходимости иметь среду Microsoft.

Howiecamp 05.10.2020 18:23

@Howiecamp Отвечает ли это на ваш вопрос?

Christian Gollhardt 05.10.2020 19:16

RazorCompileOnBuild = false не работает на ядре aspnet 5.0, пожалуйста, помогите

ahdung 15.12.2020 06:23

Вы пробовали версию> 3? @ahdung

Christian Gollhardt 15.12.2020 09:18

@ChristianGollhardt Я использую .NET 5 после перехода на core3.1, такая же проблема. Папки Pages нет в bin / debug.

ahdung 15.12.2020 09:56

Если у вас возникнет новый вопрос, задайте его. Этот вопрос не о публикации @ahdung

Christian Gollhardt 15.12.2020 10:43

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

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

Другие вопросы по теме