Partilhar via


Razor compilação de arquivos no ASP.NET Core

Razorarquivos com uma .cshtml extensão são compilados na fase de construção e publicação usando o Razor SDK. A compilação em tempo de execução pode ser ativada opcionalmente configurando o projeto.

Observação

Compilação em tempo de execução:

Razor compilação

A compilação de ficheiros em tempo de construção e em tempo de publicação está habilitada por padrão pelo SDK RazorRazor. Quando ativada, a compilação em tempo de execução complementa a compilação em tempo de construção, permitindo que os arquivos Razor sejam atualizados se forem editados enquanto o aplicativo está em execução.

A atualização Razor de visualizações e Razor Páginas durante o desenvolvimento enquanto a aplicação está em execução também é suportada usando o .NET Hot Reload.

Observação

Quando habilitada, a compilação em tempo de execução desabilita o .NET Hot Reload. Recomendamos o uso do Hot Reload em vez da compilação em tempo de execução durante o desenvolvimento.

Habilitar a compilação em tempo de execução para todos os ambientes

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

  1. Instale o pacote NuGet Razor.

  2. Ligue AddRazorRuntimeCompilation em Program.cs:

    var builder = WebApplication.CreateBuilder(args);
    
    builder.Services.AddRazorPages()
        .AddRazorRuntimeCompilation();
    

Ativar a compilação em tempo de execução de forma condicional

A compilação de tempo de execução pode ser habilitada condicionalmente, o que garante que a saída publicada:

  • Usa modos de exibição compilados.
  • Não habilita observadores de arquivos em produção.

Para ativar a compilação em tempo de execução apenas para o ambiente Development:

  1. Instale o pacote NuGet Razor.

  2. Ligue para AddRazorRuntimeCompilation em Program.cs quando o ambiente atual estiver definido como Desenvolvimento.

    var builder = WebApplication.CreateBuilder(args);
    
    var mvcBuilder = builder.Services.AddRazorPages();
    
    if (builder.Environment.IsDevelopment())
    {
        mvcBuilder.AddRazorRuntimeCompilation();
    }
    

A compilação de tempo de execução também pode ser habilitada com um assembly de inicialização de hospedagem. Para permitir a compilação em tempo de execução para perfis de início específicos no ambiente Development:

  1. Instale o pacote NuGet Razor.
  2. Modifique a seção de environmentVariables do perfil de inicialização em launchSettings.json:
    • Verifique se ASPNETCORE_ENVIRONMENT está definido como "Development".

    • Defina ASPNETCORE_HOSTINGSTARTUPASSEMBLIES como "Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation". Por exemplo, o seguinte launchSettings.json permite a compilação de tempo de execução para os perfis de lançamento ViewCompilationSample e IIS Express.

      {
        "iisSettings": {
          "windowsAuthentication": false,
          "anonymousAuthentication": true,
          "iisExpress": {
            "applicationUrl": "http://localhost:7098",
            "sslPort": 44332
          }
        },
        "profiles": {
          "ViewCompilationSample": {
            "commandName": "Project",
            "dotnetRunMessages": true,
            "launchBrowser": true,
            "applicationUrl": "https://localhost:7173;http://localhost:5251",
            "environmentVariables": {
              "ASPNETCORE_ENVIRONMENT": "Development",
              "ASPNETCORE_HOSTINGSTARTUPASSEMBLIES": "Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation"
            }
          },
          "IIS Express": {
            "commandName": "IISExpress",
            "launchBrowser": true,
            "environmentVariables": {
              "ASPNETCORE_ENVIRONMENT": "Development",
              "ASPNETCORE_HOSTINGSTARTUPASSEMBLIES": "Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation"
            }
          }
        }
      }
      

Com essa abordagem, nenhuma alteração de código é necessária no Program.cs. Durante a execução, o ASP.NET Core procura um atributo HostingStartup a nível de assembly no Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation. O HostingStartup atributo especifica o código de inicialização do aplicativo a ser executado e esse código de inicialização permite a compilação em tempo de execução.

Habilitar a compilação em tempo de execução para uma biblioteca de Razor classes

Considere um cenário no qual um Razor projeto Pages faz referência a uma biblioteca deRazor classes (RCL) chamada MyClassLib. O RCL contém um _Layout.cshtml arquivo consumido por projetos MVC e Razor Pages. Para habilitar a compilação em tempo de execução para o arquivo _Layout.cshtml nesse RCL, faça as seguintes alterações no projeto Razor Pages:

  1. Habilite a compilação de tempo de execução com as instruções em Habilitar compilação de tempo de execução condicionalmente.

  2. Configure MvcRazorRuntimeCompilationOptions em Program.cs:

    var builder = WebApplication.CreateBuilder(args);
    
    builder.Services.AddRazorPages();
    
    builder.Services.Configure<MvcRazorRuntimeCompilationOptions>(options =>
    {
        var libraryPath = Path.GetFullPath(
            Path.Combine(builder.Environment.ContentRootPath, "..", "MyClassLib"));
    
        options.FileProviders.Add(new PhysicalFileProvider(libraryPath));
    });
    

    O código anterior cria um caminho absoluto para o MyClassLib RCL. A API PhysicalFileProvider é usada para localizar diretórios e arquivos nesse caminho absoluto. Finalmente, a instância PhysicalFileProvider é adicionada à coleção de provedores de ficheiros, que permite o acesso aos ficheiros da .cshtml RCL.

Recursos adicionais

Razorarquivos com uma .cshtml extensão são compilados na fase de construção e publicação usando o Razor SDK. A compilação de tempo de execução pode ser ativada opcionalmente configurando seu projeto.

Razor compilação

A compilação de ficheiros em tempo de construção e em tempo de publicação está habilitada por padrão pelo SDK RazorRazor. Quando habilitada, a compilação em tempo de execução complementa a compilação em tempo de construção, permitindo que os arquivos Razor sejam atualizados se forem editados.

Habilitar a compilação em tempo de execução na criação do projeto

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

Na caixa de diálogo Criar um novo aplicativo Web ASP.NET Core:

  1. Selecione o modelo de projeto Aplicativo Web ou Aplicativo Web (Model-View-Controller ).
  2. Marque a caixa de seleção "Ativar compilação em tempo de execução".

Habilitar a compilação de tempo de execução num projeto existente

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

  1. Instale o pacote NuGet Razor.

  2. Atualize o método do projeto Startup.ConfigureServices para incluir uma chamada para AddRazorRuntimeCompilation. Por exemplo:

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddRazorPages()
            .AddRazorRuntimeCompilation();
    
        // code omitted for brevity
    }
    

Ativar condicionalmente a compilação em tempo de execução num projeto existente

A compilação em tempo de execução pode ser habilitada de forma que esteja disponível apenas para desenvolvimento local. Ao habilitar de forma condicional desta forma, garante-se que o resultado publicado:

  • Usa modos de exibição compilados.
  • Não habilita observadores de arquivos em produção.

Para ativar a compilação em tempo de execução apenas no ambiente Development:

  1. Instale o pacote NuGet Razor.
  2. Modifique a seção de perfil environmentVariables de inicialização em launchSettings.json:
    • Verificar que ASPNETCORE_ENVIRONMENT está definido como "Development".
    • Defina ASPNETCORE_HOSTINGSTARTUPASSEMBLIES como "Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation".

No exemplo seguinte, a compilação em tempo de execução está ativada no Development ambiente para os perfis IIS Express e de lançamento 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 alteração de código é necessária na classe do Startup projeto. Durante a execução, o ASP.NET Core procura um atributo HostingStartup a nível de assembly no Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation. O HostingStartup atributo 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.

Habilitar a compilação em tempo de execução para uma biblioteca de Razor classes

Considere um cenário no qual um Razor projeto Pages faz referência a uma biblioteca deRazor classes (RCL) chamada MyClassLib. O RCL contém um _Layout.cshtml ficheiro que todos os projetos MVC e Razor Pages da sua equipa consomem. Você deseja ativar a compilação em tempo de execução para o arquivo _Layout.cshtml nesse RCL. Faça as seguintes alterações no Razor projeto Pages:

  1. Habilite a compilação em tempo de execução com as instruções em Habilitar condicionalmente a compilação em tempo de execução em um projeto existente.

  2. Configure as opções de compilação de tempo de execução em Startup.ConfigureServices:

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddRazorPages();
    
        services.Configure<MvcRazorRuntimeCompilationOptions>(options =>
        {
            var libraryPath = Path.GetFullPath(
                Path.Combine(HostEnvironment.ContentRootPath, "..", "MyClassLib"));
            options.FileProviders.Add(new PhysicalFileProvider(libraryPath));
        });
    }
    

    No código anterior, um caminho absoluto para o RCL MyClassLib é construído. A API PhysicalFileProvider é usada para localizar diretórios e arquivos nesse caminho absoluto. Finalmente, a instância PhysicalFileProvider é adicionada à coleção de provedores de ficheiros, que permite o acesso aos ficheiros da .cshtml RCL.

Recursos adicionais