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

94

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

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

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

ОБНОВЛЕНИЕ НОЯБРЯ 2019 ДЛЯ ПОЛНОЙ РЕЛИЗЫ 3.0:

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

services.AddControllersWithViews().AddRazorRuntimeCompilation(); 

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

services.AddRazorPages().AddRazorRuntimeCompilation();
tarun713
источник
.cshtml представления razor перекомпилируются. Можете ли вы дважды проверить? Попробуйте добавить <h1> Test </h1>. Запустите приложение, загрузите страницу. вы должны увидеть «Тест». Затем измените это на <h1> Foo </h1>. Вы должны увидеть «Фу».
Джон-Люк Лауэ
Не работает! Я должен остановиться и начать решение. Записано здесь: drive.google.com/file/d/1xOWQK2SvE2dskSYRdLz9X7iEmAv7BcTN/… - Пробовали на нескольких машинах со стандартным шаблоном Razor Pages.
tarun713
Вы используете Mac, ПК или Linux? Кроме того, это может быть проблема с предварительным просмотром. Можете попробовать использовать asp.net core 2.x?
Джон-Люк Лауэ,
ПК, предварительная версия Visual Studio 2019. Я пробовал с 2.2, и все работает! Так что кое-что изменилось в версии 3.0.
tarun713
Я использую полностью обновленное ядро ​​.net 3 / VS, и .AddRazorRuntimeCompilation();мне пришлось добавить Спасибо!
duckwizzle

Ответы:

60

ОК, похоже, он еще не поддерживается :(

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

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

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

  • Добавьте ссылку на Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilationпакет. Он будет доступен как часть версии 3.0.0-preview3 .
  • Обновите приложение, ConfigureServicesвключив в него вызов AddMvcRazorRuntimeCompilation:
Лукаш Кмох
источник
11
AddMvcRazorRuntimeCompilationэто AddRazorRuntimeCompilationс ASP.NET 3.0 Ядро Preview 4
БД Фред
56

Для версии выпуска 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
    }
Рауланд
источник
Совет по версиям пакета nuget, связанным с версией ядра .Net. Если вы используете .Net Core 3.0, вы не можете выбрать более поздние версии этого пакета Nuget. Но версия 3.0.0 библиотеки Nuget работает с .Net Core 3.0. Если вы используете .Net Core 3.1, вы можете выбрать более новые версии.
Тор Аурстад
36

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

  1. Справка Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation
  2. Вызов services.AddMvc().AddRazorRuntimeCompilation()
  3. Удалите, Microsoft.VisualStudio.Web.CodeGeneration.Designесли в Microsoft.CodeAnalysis.Commonпакете есть несоответствие версии
Дмитрий Павлов
источник
2
Просто подсказка для других: при использовании Nuget отметьте / отметьте поле «предварительная версия».
GeoffM
Есть ли способ предотвратить развертывание активов в производственной среде? Я пробовал несколько комбинаций PrivateAsset в PackageReference, но, похоже, это не работает.
Чет
В опциях Core 2.2 есть FileProviders, и он работает даже без перекомпиляции. Просто отредактируйте cshtml и вуаля. В ядре 3 это свойство удалено. :( github.com/aspnet/AspNetCore/issues/14572
dariol 04
1
+1, потому что удаление пакета Microsoft.VisualStudio.Web.CodeGeneration.Design было секретным соусом, о котором больше нигде не упоминается.
tkburbidge
@tkburbidge Я тоже столкнулся с этой проблемой с пакетом. Как ни странно, у меня были две совершенно одинаковые строки, идущие подряд. Я удалил оба и смог скомпилировать. Что еще более странно , я затем вернул строки на место и все еще смог скомпилировать.
Линн Крамблинг,
26

Компиляция времени выполнения включена с помощью 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

кевич
источник
13

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

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

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

Наман Упадхьяй
источник
11

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

Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation

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

services.AddControllersWithViews (). AddRazorRuntimeCompilation ();

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

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

psuneel127
источник
6

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

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

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

Брайан Касс
источник
5

В .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();
    

После этого опубликуйте еще раз и запустите. Это будет работать.

Али Расули
источник
0

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

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

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

Пример:

{
  "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"
      }
    }
  }
}
ножницы
источник