ASP .NET Core - Compilação em runtime dos arquivos Razor


Neste artigo veremos o recurso para realizar a compilação em tempo de execução dos arquivos Razor na ASP.NET Core 5.0.

Os arquivos Razor com uma extensão .cshtml são compilados no momento da construção e publicação usando o Razor SDK. A compilação em tempo de execução pode ser opcionalmente habilitada configurando seu projeto.

A compilação em tempo de construção e tempo de publicação de arquivos Razor é habilitada por padrão pelo Razor SDK.

Quando habilitada, a compilação em tempo de execução complementa a compilação em tempo de construção, permitindo que os arquivos do Razor sejam atualizados se forem editados.

Podemos habilitar a compilação em runtime no momento de criar o projeto.

Os templates de projeto Razor Pages e MVC incluem uma opção para habilitar a compilação em tempo de execução quando o projeto é criado. Esta opção tem suporte no ASP.NET Core 3.1 e posterior.

1- No Visual Studio

Ao criar o projeto basta selecionar o template e marcar a opção :  Enable Razor runtime compilation

2- No Visual Studio Code

Use a opção de template  -rrc  ou --razor-runtime-compilation.

Por exemplo, o comando a seguir cria um novo projeto Razor Pages com a compilação em tempo de execução habilitada:

dotnet new webapp --razor-runtime-compilation

Projetos já existentes

Para habilitar a compilação de tempo de execução para todos os ambientes em um projeto existente:

  1. Instale o pacote NuGet Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.
     
  2. Atualize o método Startup.ConfigureServices do projeto para incluir uma chamada para AddRazorRuntimeCompilation.

Exemplo:

public void ConfigureServices(IServiceCollection services)
{
    services.AddRazorPages()
        .AddRazorRuntimeCompilation();
    // ...
}

Compilação condição

A compilação em tempo de execução pode ser habilitada de forma que esteja disponível apenas para desenvolvimento local. A ativação condicional desta maneira garante que a saída publicada:

Para habilitar a compilação de tempo de execução apenas no ambiente de desenvolvimento faça o seguinte:

  1. Instale o pacote NuGet Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.
  2. Modifique a seção environmentVariables do perfil de inicialização em launchSettings.json:

No exemplo a seguir, a compilação em tempo de execução é ativada no ambiente de desenvolvimento para os perfis de inicialização IIS Express e RazorPagesApp:

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

Nenhuma mudança de código é necessária na classe de inicialização do projeto.

No runtime, o ASP.NET Core procura um atributo HostingStartup de nível de assembly em  Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.

O atributo HostingStartup especifica o código de inicialização do aplicativo a ser executado. Esse código de inicialização permite a compilação em tempo de execução.

E estamos conversados...

"Porque a palavra de Deus é viva e eficaz, e mais penetrante do que espada alguma de dois gumes, e penetra até à divisão da alma e do espírito, e das juntas e medulas, e é apta para discernir os pensamentos e intenções do coração."
Hebreus 4:12

Referências:


José Carlos Macoratti