.NET Core 3.0: las vistas Razor no se recompilan automáticamente al cambiar

94

De acuerdo con la documentación , las vistas de Razor deberían, de forma predeterminada, recompilarse al cambiar en entornos locales para ASP.NET Core 3.0.

Sin embargo, mi proyecto no hace esto localmente. Si cambio una vista y actualizo cuando estoy depurando localmente, el cambio no se refleja. Tengo que detener la solución, volver a ejecutarla y luego ver el cambio.

Estoy haciendo esto en una plantilla de aplicación web ASP.NET Core predeterminada en Visual Studio 2019 con ASP.NET Core 3.0.0 Preview 2 usando páginas de Razor. ¿Alguna idea de si necesito cambiar la configuración para habilitar esta función?

ACTUALIZACIÓN DE NOVIEMBRE DE 2019 PARA EL LANZAMIENTO COMPLETO 3.0:

Esta pregunta todavía recibe muchas visitas. Se han citado algunas respuestas para agregar

services.AddControllersWithViews().AddRazorRuntimeCompilation(); 

A su ConfigureServices()función Startup.csdespués de agregar el Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilationpaquete NuGet. En mi caso, solo estoy usando Razor Pages, así que no llamo AddControllersWithViews(). En cambio, esto funcionó para mí:

services.AddRazorPages().AddRazorRuntimeCompilation();
tarun713
fuente
Las vistas de .cshtml razor se vuelven a compilar. ¿Puedes comprobarlo? Intente agregar una <h1> Prueba </h1>. Inicie la aplicación, cargue la página. debería ver "Prueba". Luego cámbielo a <h1> Foo </h1>. Debería ver "Foo".
John-Luke Laue
¡No funciona! Tengo que detenerme e iniciar la solución. Lo capturé aquí: drive.google.com/file/d/1xOWQK2SvE2dskSYRdLz9X7iEmAv7BcTN/… - Lo he probado en varias máquinas con la plantilla original de Razor Pages.
tarun713
¿Está ejecutando un en mac, pc o linux? Además, podría ser un problema con la vista previa. ¿Puedes intentar usar asp.net core 2.x?
John-Luke Laue
PC, vista previa de Visual Studio 2019. ¡Probé con 2.2 y funciona! Entonces, hay algo que cambió en 3.0.
tarun713
Estoy en un .net core 3 / VS completamente actualizado y tuve que agregar ¡ .AddRazorRuntimeCompilation();Gracias!
duckwizzle

Respuestas:

60

De acuerdo, parece que aún no es compatible :(

Se eliminó la compilación en tiempo de ejecución Como consecuencia de la limpieza del marco compartido de ASP.NET Core para no depender de Roslyn, la compatibilidad con la compilación en tiempo de ejecución de páginas y vistas también se eliminó en esta versión preliminar. En cambio, la compilación de páginas y vistas se realiza en el momento de la compilación. En una futura actualización de vista previa, proporcionaremos paquetes NuGet para habilitar opcionalmente la compatibilidad con la compilación en tiempo de ejecución en una aplicación.

Puede leer más sobre el problema aquí https://github.com/aspnet/Announcements/issues/343

Las aplicaciones que requieren compilación en tiempo de ejecución o recompilación de archivos Razor deben:

  • Agrega una referencia al Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilationpaquete. Estará disponible como parte de la versión 3.0.0-preview3 .
  • Actualice la aplicación ConfigureServicespara incluir una llamada a AddMvcRazorRuntimeCompilation:
Lukáš Kmoch
fuente
11
AddMvcRazorRuntimeCompilationes AddRazorRuntimeCompilationcon ASP.Net Core 3.0 Preview 4
DB Fred
56

Para la versión de lanzamiento de ASP.NET Core 3:

   services.AddControllersWithViews().AddRazorRuntimeCompilation();

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

También se puede habilitar de forma condicional solo para el desarrollo local, citado en el enlace:

La compilación en tiempo de ejecución se puede habilitar de modo que solo esté disponible para el desarrollo local. La habilitación condicional de esta manera asegura que la salida publicada:

Utiliza vistas compiladas.
Es de menor tamaño.
No habilita los observadores de archivos en producción.

   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
fuente
Sugerencia sobre las versiones del paquete nuget relacionadas con la versión principal de .Net. En caso de que use .Net Core 3.0, no puede seleccionar las versiones posteriores de este paquete de Nuget. Pero la versión 3.0.0 de Nuget lib funciona con .Net Core 3.0. Si usa .Net Core 3.1, puede seleccionar versiones más recientes.
Tore Aurstad
36

Para obtener la compilación de vista en tiempo de ejecución en ASP.NET Core3

  1. Referencia Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation
  2. Llamada services.AddMvc().AddRazorRuntimeCompilation()
  3. Eliminar Microsoft.VisualStudio.Web.CodeGeneration.Designsi hay una discrepancia de versión en el Microsoft.CodeAnalysis.Commonpaquete
Dmitry Pavlov
fuente
2
Solo una pista para otros: cuando use Nuget, marque / marque la casilla "pre-lanzamiento".
GeoffM
¿Existe alguna forma de evitar que los activos se implementen en producción? Probé algunas combinaciones de PrivateAssets en PackageReference pero no parece funcionar.
Chet
En Core 2.2, las opciones de maquinilla de afeitar tienen FileProviders y funcionan incluso sin ninguna recompilación. Simplemente edite cshtml y listo. En el núcleo 3 se elimina esta propiedad. :( github.com/aspnet/AspNetCore/issues/14572
dariol
1
+1 porque eliminar el paquete Microsoft.VisualStudio.Web.CodeGeneration.Design fue la salsa secreta que en ningún otro lugar se menciona.
tkburbidge
@tkburbidge También me encontré con ese problema con el paquete. Curiosamente, tenía dos líneas que eran exactamente iguales, una tras otra. Eliminé ambos y pude compilar. Aún más extraño , luego volví a colocar las líneas en su lugar y aún pude compilar.
Lynn Crumbling
26

La compilación en tiempo de ejecución se habilita mediante el Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilationpaquete. Para habilitar la compilación en tiempo de ejecución, las aplicaciones deben:

  1. Instale el Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilationpaquete NuGet.

  2. Actualice el Startup.ConfigureServicesmétodo del proyecto para incluir una llamada a AddRazorRuntimeCompilation:

services
    .AddControllersWithViews()
    .AddRazorRuntimeCompilation();

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

kevic
fuente
13

Para volver a obtener la compilación de vistas de Razor en tiempo de ejecución en ASP.NET Core 3.1:

  1. Instale el Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilationpaquete NuGet.
  2. Actualice el Startup.ConfigureServicesmétodo del proyecto para incluir una llamada a AddRazorRuntimeCompilation.
  3. services.AddRazorPages().AddRazorRuntimeCompilation();

    Compilación de archivos Razor en ASP.NET Core 3.1

Naman Upadhyay
fuente
11

Paso 1: instale el siguiente paquete desde NuGet Package Manager for Solution.

Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation

Paso 2: agregue el siguiente código en el archivo ConfigureServices of Startup.cs

services.AddControllersWithViews (). AddRazorRuntimeCompilation ();

Guarde la página y luego actualice el navegador del cliente.

Si está utilizando Razor, agregue el código para services.AddRazorPages (). AddRazorRuntimeCompilation ();

psuneel127
fuente
5

En .NET Core 3.1, necesita deshabilitar la generación del views.dllarchivo.

  1. Agregue el siguiente código a su .csprojarchivo (en la raíz de su proyecto):

    <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. Instale el siguiente paquete desde NuGet Package Manager para la solución.

    Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation
    
  3. Agregue el siguiente código al ConfigureServicesmétodo de su Startup.csarchivo:

    services.AddMvc().AddRazorRuntimeCompilation();
    

    O

    services.AddControllersWithViews().AddRazorRuntimeCompilation();
    

    O

    services.AddRazorPages().AddRazorRuntimeCompilation();
    

Después de esto, vuelva a publicar y ejecútelo. Funcionará.

Ali Rasouli
fuente
0

La forma más sencilla de configurar la compilación en tiempo de ejecución solo para el desarrollo local es actualizar los perfiles de inicio en launchSettings.json . Este método no requiere cambios de código para configurar un proyecto que se ejecuta localmente (no afectará su producción).

Ver la documentación oficial :

  1. Instale Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation paquete NuGet .
  2. Modifique la sección EnvironmentVariables del perfil de lanzamiento en launchSettings.json:
    • Verificar ASPNETCORE_ENVIRONMENT está configurado en "Desarrollo".
    • Establecer ASPNETCORE_HOSTINGSTARTUPASSEMBLIESen "Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation".

Ejemplo:

{
  "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"
      }
    }
  }
}
tijeras
fuente