.NET Core 3.0: представления Razor не перекомпилируются автоматически при изменении

#c# #visual-studio #razor-pages

Вопрос:

Согласно документации, представления Razor по умолчанию должны перекомпилироваться при изменении в локальных средах для ASP.NET Ядро 3.0.

Однако мой проект не делает этого локально. Если я изменяю представление и обновляю его при локальной отладке, это изменение не отражается. Я должен остановить решение, повторить запуск, а затем увидеть изменения.

Я делаю это по умолчанию ASP.NET Основной шаблон веб-приложения в Visual Studio 2019 с ASP.NET Ядро 3.0.0 Предварительный просмотр 2 с использованием страниц Razor. Есть идеи, нужно ли мне изменить настройки, чтобы включить эту функцию?

ОБНОВЛЕНИЕ НОЯБРЬ 2019 ДЛЯ ПОЛНОЙ ВЕРСИИ 3.0:

Этот вопрос все еще вызывает много мнений. Несколько ответов были процитированы, чтобы добавить

 services.AddControllersWithViews().AddRazorRuntimeCompilation(); 
 

В вашу ConfigureServices() функцию Startup.cs после добавления Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation пакета NuGet. В моем случае я использую только страницы Razor, поэтому я не звоню AddControllersWithViews() . Вместо этого это сработало для меня:

 services.AddRazorPages().AddRazorRuntimeCompilation();
 

Комментарии:

1. .представления cshtml razor действительно перекомпилируются. Вы можете перепроверить? Попробуйте добавить тест <h1><h1></h1>. Запустите приложение, загрузите страницу. вы должны увидеть «Тест». Затем измените это на <h1>Foo<h1></h1>. Вы должны увидеть «Фу».

2. Не работает! Я должен остановиться и начать решение. Запечатлел это здесь: drive.google.com/file/d/1xOWQK2SvE2dskSYRdLz9X7iEmAv7BcTN/… — Пробовал на нескольких машинах использовать стандартный шаблон страниц Razor.

3. Вы работаете на Mac, ПК или linux? Кроме того, это может быть проблемой с предварительным просмотром. Можете ли вы попробовать использовать asp.net ядро 2.x?

4. ПК, предварительный просмотр Visual Studio 2019. Я попробовал с 2.2, и это работает! Итак, в версии 3.0 кое-что изменилось.

5. Я нахожусь на полностью обновленном .net core 3/VS и должен был добавить .AddRazorRuntimeCompilation(); Спасибо!

Ответ №1:

Для ASP.NET Версия выпуска Core 3:

    services.AddControllersWithViews().AddRazorRuntimeCompilation();
 

https://docs.microsoft.com/en-us/aspnet/core/mvc/views/view-compilation?view=aspnetcore-3.0

Он также может быть включен условно только для местного развития, приведенного по ссылке:

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

Использует скомпилированные представления.
Имеет меньший размер.
Не позволяет наблюдателям за файлами в рабочей среде.

    public Startup(IConfiguration configuration, IWebHostEnvironment env)
    {
        Configuration = configuration;
        Env = env;
    }

    public IWebHostEnvironment Env { get; set; }
    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        IMvcBuilder builder = services.AddRazorPages();

#if DEBUG
            if (Env.IsDevelopment())
            {
                builder.AddRazorRuntimeCompilation();
            }
#endif
    }
 

Комментарии:

1. Совет о версиях пакета nuget, связанных с . Версия Net core. На случай, если вы используете . Net Core 3.0, вы не можете выбрать более поздние версии этого пакета Nuget. Но версия 3.0.0 библиотеки Nuget работает с .Net Core 3.0. Если вы используете . Net Core 3.1, вы можете выбрать более новые версии.

Ответ №2:

Хорошо, похоже, что это еще не поддерживается 🙁

Компиляция во время выполнения удалена в результате очистки ASP.NET Основная общая платформа, чтобы не зависеть от Roslyn, поддержка компиляции страниц и представлений во время выполнения также была удалена в этом предварительном выпуске. Вместо этого компиляция страниц и представлений выполняется во время сборки. В будущем предварительном обновлении мы предоставим пакеты NuGet для дополнительного включения поддержки компиляции во время выполнения в приложении.

Вы можете прочитать больше об этой проблеме здесь https://github.com/aspnet/Announcements/issues/343

Приложения, которым требуется компиляция во время выполнения или повторная компиляция файлов Razor, должны:

  • Добавьте ссылку на Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation пакет. Он будет доступен как часть выпуска 3.0.0-preview3.
  • Обновите приложение ConfigureServices , чтобы включить вызов на AddMvcRazorRuntimeCompilation :

Комментарии:

1. AddMvcRazorRuntimeCompilation находится AddRazorRuntimeCompilation с ASP.Net Предварительный просмотр ядра 3.0 4

Ответ №3:

Чтобы вернуть компиляцию представления времени выполнения в ASP.NET Core 3

  1. Ссылка Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation
  2. Вызов services.AddMvc().AddRazorRuntimeCompilation()
  3. Удалите Microsoft.VisualStudio.Web.CodeGeneration.Design , если в пакете есть несоответствие версии Microsoft.CodeAnalysis.Common

Комментарии:

1. Просто подсказка для других: при использовании Nuget отметьте/установите флажок «предварительный выпуск».

2. Есть ли способ предотвратить развертывание активов в производство? Я попробовал несколько комбинаций частных наборов на упаковке, но, похоже, это не работает.

3. В ядре 2.2 razor options есть файлообменники, и он работает даже без какой-либо перекомпиляции. Просто отредактируйте cshtml и вуаля. В ядре 3 это свойство удалено. 🙁 github.com/aspnet/AspNetCore/issues/14572

4. 1 из-за удаления кодирования Microsoft.VisualStudio.Web.. Дизайн упаковки был секретным соусом, о котором больше нигде не упоминается.

5. @tkburbidge Я тоже только что столкнулся с этой проблемой с пакетом. Как ни странно, у меня было две строки, которые были совершенно одинаковыми, спина к спине. Я удалил и то, и другое и смог скомпилировать. Еще более странно , что затем я вернул строки на место и все еще смог скомпилировать.

Ответ №4:

Компиляция во время выполнения включена с помощью Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation пакета. Чтобы включить компиляцию во время выполнения, приложения должны:

  1. Установите Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation пакет NuGet.
  2. Обновите метод проекта Startup.ConfigureServices , чтобы включить вызов AddRazorRuntimeCompilation :
 services
    .AddControllersWithViews()
    .AddRazorRuntimeCompilation();
 

https://docs.microsoft.com/en-us/aspnet/core/mvc/views/view-compilation?view=aspnetcore-3.0

Ответ №5:

Чтобы вернуть компиляцию представлений Razor во время выполнения в ASP.NET Ядро 3.1:

  1. Установите Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation пакет NuGet.
  2. Обновите метод проекта Startup.ConfigureServices , чтобы включить вызов AddRazorRuntimeCompilation .
  3. services.AddRazorPages().AddRazorRuntimeCompilation() ;

    Компиляция файлов Razor в ASP.NET Ядро 3.1

Ответ №6:

Шаг 1. Установите приведенный ниже пакет из диспетчера пакетов NuGet для решения.

Майкрософт.AspNetCore.Mvc.Бритва.Компиляция времени выполнения

Шаг 2: Добавьте приведенный ниже код в конфигурационные службы файла Startup.cs

Услуги.AddControllersWithViews().AddRazorRuntimeCompilation();

Сохраните страницу, а затем обновите браузер клиента.

Если вы используете Razor, добавьте код для служб.AddRazorPages().AddRazorRuntimeCompilation();

Ответ №7:

В .NET Core 3.1 вам необходимо отключить генерацию views.dll файла.

  1. Добавьте приведенный ниже код в свой .csproj файл (в корень вашего проекта).:
     <PropertyGroup>
        <TargetFramework>netcoreapp3.1</TargetFramework>
        <UserSecretsId>...</UserSecretsId>
    
        <!-- add from this line: -->
        <CopyRazorGenerateFilesToPublishDirectory>true</CopyRazorGenerateFilesToPublishDirectory>
        <CopyRefAssembliesToPublishDirectory>false</CopyRefAssembliesToPublishDirectory>
        <MvcRazorCompileOnPublish>false</MvcRazorCompileOnPublish>
        <RazorCompileOnBuild>false</RazorCompileOnBuild>
        <!-- to this line. -->
    
    </PropertyGroup>
     
  2. Установите приведенный ниже пакет из менеджера пакетов NuGet для решения.
     Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation
     
  3. Добавьте приведенный ниже код в ConfigureServices метод вашего Startup.cs файла:
     services.AddMvc().AddRazorRuntimeCompilation();
     

    Или

     services.AddControllersWithViews().AddRazorRuntimeCompilation();
     

    Или

     services.AddRazorPages().AddRazorRuntimeCompilation();
     

После этого снова опубликуйте и запустите его. Это сработает.

Комментарии:

1. Для моего .NET 5.0 внутри .csproj требовались только следующие теги <RazorCompileOnBuild>false</RazorCompileOnBuild> <RazorCompileOnPublish>false</RazorCompileOnPublish> <CopyRefAssembliesToPublishDirectory>false</CopyRefAssembliesToPublishDirectory> , также требовались все остальные 2 и 3 шага

Ответ №8:

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

  • Использует скомпилированные представления.
  • Имеет меньший размер.
  • Не позволяет наблюдателям за файлами в рабочей среде.

Условно включить компиляцию во время выполнения

Ответ №9:

Самый простой способ настроить компиляцию среды выполнения только для локальной разработки-обновить профили запуска в launchSettings.json . Этот метод не требует изменений кода для настройки проекта, который выполняется локально (это не повлияет на ваше производство).

Смотрите официальную документацию:

  1. Установите Microsoft.AspNetCore.Mvc.Бритва.Пакет NuGet для компиляции во время выполнения.
  2. Измените раздел Переменные среды профиля запуска в файле launchSettings.json:
    • Для проверки ASPNETCORE_ENVIRONMENT установлено значение «Разработка».
    • Установите ASPNETCORE_HOSTINGSTARTUPASSEMBLIES значение «Microsoft.AspNetCore.Mvc.Бритва.Компиляция времени выполнения».

Пример:

 {
  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:57676",
      "sslPort": 44364
    }
  },
  "profiles": {
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development",
        "ASPNETCORE_HOSTINGSTARTUPASSEMBLIES": "Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation"
      }
    },
    "RazorPagesApp": {
      "commandName": "Project",
      "launchBrowser": true,
      "applicationUrl": "https://localhost:5001;http://localhost:5000",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development",
        "ASPNETCORE_HOSTINGSTARTUPASSEMBLIES": "Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation"
      }
    }
  }
}