.NET Core 3,0: widoki Razor nie są automatycznie ponownie kompilowane po zmianie

94

Zgodnie z dokumentacją widoki Razor powinny domyślnie ponownie kompilować po zmianie w środowiskach lokalnych dla ASP.NET Core 3,0.

Jednak mój projekt nie robi tego lokalnie. Jeśli zmienię widok i odświeżę podczas debugowania lokalnie, zmiana nie zostanie odzwierciedlona. Muszę zatrzymać rozwiązanie, uruchomić je ponownie, a następnie zobaczyć zmianę.

Robię to na domyślnym szablonie aplikacji sieci Web ASP.NET Core w programie Visual Studio 2019 z ASP.NET Core 3.0.0 w wersji zapoznawczej 2 przy użyciu stron Razor. Masz jakiś pomysł, czy muszę zmienić ustawienia, aby włączyć tę funkcję?

AKTUALIZACJA LISTOPADA 2019 DO PEŁNEJ WYDANIA 3.0:

To pytanie wciąż ma wiele opinii. Kilka odpowiedzi zacytowano do dodania

services.AddControllersWithViews().AddRazorRuntimeCompilation(); 

Do ConfigureServices()funkcji w Startup.cspo dodaniu Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilationpakietu NuGet. W moim przypadku używam tylko Razor Pages, więc nie dzwonię AddControllersWithViews(). Zamiast tego zadziałało to dla mnie:

services.AddRazorPages().AddRazorRuntimeCompilation();
tarun713
źródło
.cshtml widoki maszynki do golenia są ponownie kompilowane. Czy możesz dwukrotnie sprawdzić? Spróbuj dodać <h1> test </h1>. Uruchom aplikację, załaduj stronę. powinieneś zobaczyć „Test”. Następnie zmień to na <h1> Foo </h1>. Powinieneś zobaczyć „Foo”.
John-Luke Laue
Nie działa! Muszę się zatrzymać i rozpocząć rozwiązanie. Uchwycono to tutaj: drive.google.com/file/d/1xOWQK2SvE2dskSYRdLz9X7iEmAv7BcTN/ ... - Próbowałem na wielu komputerach z szablonem Razor Pages.
tarun713
Czy korzystasz z komputera Mac, PC lub Linux? Może to być również problem z podglądem. Czy możesz spróbować użyć asp.net core 2.x?
John-Luke Laue
PC, wersja zapoznawcza programu Visual Studio 2019. Próbowałem z 2.2 i działa! Więc jest coś, co zmieniło się w 3.0.
tarun713
Jestem na w pełni zaktualizowanym .net core 3 / VS i musiałem dodać .AddRazorRuntimeCompilation();Dziękuję!
Duckwizzle

Odpowiedzi:

60

OK, wygląda na to, że nie jest jeszcze obsługiwany :(

Usunięto kompilację środowiska uruchomieniowego W wyniku oczyszczenia udostępnionej platformy ASP.NET Core, aby nie była zależna od Roslyn, w tej wersji zapoznawczej została również usunięta obsługa kompilacji stron i widoków w czasie wykonywania. Zamiast tego kompilacja stron i widoków jest wykonywana w czasie kompilacji. W przyszłej aktualizacji zapoznawczej udostępnimy pakiety NuGet do opcjonalnego włączenia obsługi kompilacji w czasie wykonywania w aplikacji.

Możesz przeczytać więcej na temat problemu tutaj https://github.com/aspnet/Announcements/issues/343

Aplikacje wymagające kompilacji w czasie wykonywania lub ponownej kompilacji plików Razor powinny:

  • Dodaj odniesienie do Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilationpakietu. Będzie dostępny jako część wersji 3.0.0-preview3 .
  • Zaktualizuj aplikację, ConfigureServicesaby zawierała wywołanie AddMvcRazorRuntimeCompilation:
Lukáš Kmoch
źródło
11
AddMvcRazorRuntimeCompilationjest AddRazorRuntimeCompilationz ASP.Net Core 3.0 Preview 4
DB Fred
56

Wersja wydania ASP.NET Core 3:

   services.AddControllersWithViews().AddRazorRuntimeCompilation();

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

Można go również włączyć warunkowo tylko dla lokalnego rozwoju, cytowany z linku:

Kompilację w czasie wykonywania można włączyć tak, aby była dostępna tylko dla programowania lokalnego. Włączenie warunkowe w ten sposób gwarantuje, że opublikowane dane wyjściowe:

Używa skompilowanych widoków.
Jest mniejszy.
Nie włącza obserwatorów plików w produkcji.

   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
    }
Rauland
źródło
Porada dotycząca wersji pakietu NuGet związanych z wersją .NET Core. W przypadku korzystania z .Net Core 3.0 nie można wybrać późniejszych wersji tego pakietu Nuget. Ale wersja 3.0.0 biblioteki Nuget współpracuje z .Net Core 3.0. Jeśli używasz .Net Core 3.1, możesz wybrać nowsze wersje.
Tore Aurstad
36

Aby odzyskać kompilację widoku środowiska uruchomieniowego w wersji ASP.NET Core3

  1. Odniesienie Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation
  2. Połączenie services.AddMvc().AddRazorRuntimeCompilation()
  3. Usuń, Microsoft.VisualStudio.Web.CodeGeneration.Designjeśli w Microsoft.CodeAnalysis.Commonpakiecie występuje niezgodność wersji
Dmitrij Pawłow
źródło
2
Wskazówka dla innych: podczas korzystania z Nuget zaznacz / zaznacz pole „przedpremierowe”.
GeoffM,
Czy istnieje sposób, aby zapobiec wdrożeniu zasobów do produkcji? Wypróbowałem kilka kombinacji PrivateAssets w PackageReference, ale wydaje się, że nie działa.
Chet
W Core 2.2 opcje maszynki do golenia mają FileProviders i działają nawet bez ponownej kompilacji. Po prostu edytuj cshtml i voila. W rdzeniu 3 ta właściwość została usunięta. :( github.com/aspnet/AspNetCore/issues/14572
dariol
1
+1, ponieważ usunięcie pakietu Microsoft.VisualStudio.Web.CodeGeneration.Design było sekretnym sosem, o którym nigdzie indziej nie wspomina.
tkburbidge
@tkburbidge Właśnie napotkałem ten problem z pakietem. Co dziwne, miałem dwie linie, które były dokładnie takie same, jeden po drugim. Usunąłem oba i mogłem skompilować. Co dziwniejsze , potem umieściłem linie z powrotem na miejscu i nadal byłem w stanie skompilować.
Lynn Crumbling
26

Kompilację w czasie wykonywania można włączyć przy użyciu Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilationpakietu. Aby włączyć kompilację w czasie wykonywania, aplikacje muszą:

  1. Zainstaluj Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilationpakiet NuGet.

  2. Zaktualizuj Startup.ConfigureServicesmetodę projektu, aby zawierała wywołanie AddRazorRuntimeCompilation:

services
    .AddControllersWithViews()
    .AddRazorRuntimeCompilation();

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

kevic
źródło
13

Aby odzyskać kompilację Razor Views w środowisku uruchomieniowym w ASP.NET Core 3.1:

  1. Zainstaluj Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilationpakiet NuGet.
  2. Zaktualizuj Startup.ConfigureServicesmetodę projektu, aby zawierała wywołanie AddRazorRuntimeCompilation.
  3. services.AddRazorPages().AddRazorRuntimeCompilation();

    Kompilacja plików Razor w ASP.NET Core 3.1

Naman Upadhyay
źródło
11

Krok 1: Zainstaluj poniższy pakiet z Menedżera pakietów NuGet w celu rozwiązania.

Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation

Krok 2: Dodaj poniższy kod w ConfigureServices pliku Startup.cs

services.AddControllersWithViews (). AddRazorRuntimeCompilation ();

Zapisz stronę, a następnie odśwież przeglądarkę klienta.

Jeśli używasz Razor, dodaj kod dla services.AddRazorPages (). AddRazorRuntimeCompilation ();

psuneel127
źródło
6

Tylko dodatkowa uwaga - możesz tylko warunkowo włączyć tę kompilację środowiska uruchomieniowego, aby opublikowane dane wyjściowe:

  • Używa skompilowanych widoków.
  • Jest mniejszy.
  • Nie włącza obserwatorów plików w produkcji.

Warunkowo włącz kompilację w czasie wykonywania

BryanCass
źródło
5

W .NET Core 3.1 należy wyłączyć generowanie views.dllpliku.

  1. Dodaj poniższy kod do swojego .csprojpliku (w katalogu głównym projektu):

    <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. Zainstaluj poniższy pakiet z Menedżera pakietów NuGet dla rozwiązania.

    Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation
    
  3. Dodaj poniższy kod do ConfigureServicesmetody swojego Startup.cspliku:

    services.AddMvc().AddRazorRuntimeCompilation();
    

    Lub

    services.AddControllersWithViews().AddRazorRuntimeCompilation();
    

    Lub

    services.AddRazorPages().AddRazorRuntimeCompilation();
    

Następnie opublikuj ponownie i uruchom go. To będzie działać.

Ali Rasouli
źródło
0

Najprostszym sposobem skonfigurowania kompilacji środowiska wykonawczego tylko do lokalnego programowania jest aktualizacja profili uruchamiania w launchSettings.json. Ta metoda nie wymaga żadnych zmian w kodzie, aby skonfigurować projekt, który działa lokalnie (nie wpłynie to na twoją produkcję).

Zobacz oficjalną dokumentację :

  1. Zainstaluj pakiet NuGet Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation .
  2. Zmodyfikuj sekcję environmentVariables profilu uruchamiania w pliku launchSettings.json:
    • Weryfikacja ASPNETCORE_ENVIRONMENTjest ustawiona na „Programowanie”.
    • Ustaw ASPNETCORE_HOSTINGSTARTUPASSEMBLIESna „Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation”.

Przykład:

{
  "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"
      }
    }
  }
}
nożyczki
źródło