.NET Core 3.0: visualizações Razor não recompilam automaticamente na mudança

100

De acordo com a documentação , as visualizações do Razor devem, por padrão, recompilar na mudança em ambientes locais para ASP.NET Core 3.0.

No entanto, meu projeto não faz isso localmente. Se eu alterar uma visualização e atualizar quando estiver depurando localmente, a alteração não será refletida. Tenho que interromper a solução, executar novamente e ver a mudança.

Estou fazendo isso em um modelo de aplicativo da Web ASP.NET Core padrão no Visual Studio 2019 com ASP.NET Core 3.0.0 Preview 2 usando páginas do Razor. Alguma ideia se eu preciso mudar as configurações para habilitar este recurso?

ATUALIZAÇÃO DE NOVEMBRO DE 2019 PARA O 3.0 FULL RELEASE:

Esta questão ainda recebe muitos pontos de vista. Algumas respostas citadas para adicionar

services.AddControllersWithViews().AddRazorRuntimeCompilation(); 

Para sua ConfigureServices()função Startup.csapós adicionar o Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilationpacote NuGet. No meu caso, estou usando apenas o Razor Pages, então não ligo AddControllersWithViews(). Em vez disso, isso funcionou para mim:

services.AddRazorPages().AddRazorRuntimeCompilation();
tarun713
fonte
As visualizações do razor .cshtml são recompiladas. Você pode verificar? Tente adicionar um <h1> Teste </h1>. Inicie o aplicativo, carregue a página. você deve ver "Teste". Em seguida, mude para <h1> Foo </h1>. Você deverá ver "Foo".
John-Luke Laue
Não funciona! Tenho que parar e iniciar a solução. Capturado aqui: drive.google.com/file/d/1xOWQK2SvE2dskSYRdLz9X7iEmAv7BcTN/… - Tentei em várias máquinas com o modelo Razor Pages.
tarun713 de
Você está executando um Mac ou PC ou Linux? Além disso, pode ser um problema com a visualização. Você pode tentar usar asp.net core 2.x?
John-Luke Laue
PC, visualização do Visual Studio 2019. Tentei com 2.2 e funciona! Portanto, há algo que mudou no 3.0.
tarun713
Estou em um .net core 3 / VS totalmente atualizado e tive que adicionar .AddRazorRuntimeCompilation();Obrigado!
duckwizzle de

Respostas:

61

OK, parece que ainda não é compatível :(

Compilação de tempo de execução removida Como consequência da limpeza da estrutura compartilhada do ASP.NET Core para não depender do Roslyn, o suporte para compilação de tempo de execução de páginas e visualizações também foi removido nesta versão de visualização. Em vez disso, a compilação de páginas e visualizações é realizada no momento da construção. Em uma atualização de visualização futura, forneceremos pacotes NuGet para habilitar opcionalmente o suporte à compilação em tempo de execução em um aplicativo.

Você pode ler mais sobre o problema aqui https://github.com/aspnet/Announcements/issues/343

Os aplicativos que requerem compilação em tempo de execução ou recompilação de arquivos Razor devem:

  • Adicione uma referência ao Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilationpacote. Ele estará disponível como parte da versão 3.0.0-preview3 .
  • Atualize o aplicativo ConfigureServicespara incluir uma chamada para AddMvcRazorRuntimeCompilation:
Lukáš Kmoch
fonte
11
AddMvcRazorRuntimeCompilationé AddRazorRuntimeCompilationcom ASP.Net Core 3.0 Preview 4
DB Fred
57

Para a versão de lançamento do ASP.NET Core 3:

   services.AddControllersWithViews().AddRazorRuntimeCompilation();

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

Também pode ser habilitado condicionalmente apenas para desenvolvimento local, citado no link:

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

Usa visualizações compiladas.
É menor em tamanho.
Não habilita observadores de arquivos em produção.

   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
fonte
Dica sobre as versões do pacote nuget relacionadas à versão do núcleo .Net. No caso de você usar .Net Core 3.0, você não pode selecionar as versões posteriores deste pacote Nuget. Mas a versão 3.0.0 do Nuget lib funciona com .Net Core 3.0. Se você usa .Net Core 3.1, pode selecionar versões mais recentes.
Rasgou Aurstad em
38

Para obter a compilação da visualização do tempo de execução em ASP.NET Core3

  1. Referência Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation
  2. Ligar services.AddMvc().AddRazorRuntimeCompilation()
  3. Remova Microsoft.VisualStudio.Web.CodeGeneration.Designse houver uma incompatibilidade de versão no Microsoft.CodeAnalysis.Commonpacote
Dmitry Pavlov
fonte
2
Apenas uma dica para outros: ao usar o Nuget, marque / marque a caixa "pré-lançamento".
GeoffM
Existe uma maneira de evitar que os ativos sejam implantados na produção? Tentei algumas combinações de PrivateAssets em PackageReference, mas não parece funcionar.
Chet
No Core 2.2 razor options tem FileProviders e funciona mesmo sem qualquer recompilação. Apenas edite cshtml e voila. No núcleo 3, essa propriedade foi removida. :( github.com/aspnet/AspNetCore/issues/14572
dariol
2
+1 porque remover o pacote Microsoft.VisualStudio.Web.CodeGeneration.Design era o molho secreto que em nenhum outro lugar menciona.
tkburbidge
@tkburbidge Acabei de ter esse problema com o pacote também. Curiosamente, eu tinha duas linhas que eram exatamente iguais, consecutivas. Eu removi ambos e pude compilar. Ainda mais estranhamente , coloquei as linhas de volta no lugar e ainda fui capaz de compilar.
Lynn Crumbling,
26

A compilação em tempo de execução é ativada usando o Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilationpacote. Para habilitar a compilação em tempo de execução, os aplicativos devem:

  1. Instale o Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilationpacote NuGet.

  2. Atualize o Startup.ConfigureServicesmétodo do projeto para incluir uma chamada para AddRazorRuntimeCompilation:

services
    .AddControllersWithViews()
    .AddRazorRuntimeCompilation();

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

kevic
fonte
14

Para obter a compilação de visualizações do Razor no ASP.NET Core 3.1:

  1. Instale o Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilationpacote NuGet.
  2. Atualize o Startup.ConfigureServicesmétodo do projeto para incluir uma chamada para AddRazorRuntimeCompilation.
  3. services.AddRazorPages().AddRazorRuntimeCompilation();

    Compilação do arquivo Razor no ASP.NET Core 3.1

Naman Upadhyay
fonte
12

Etapa 1: instale o pacote abaixo do NuGet Package Manager for Solution.

Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation

Etapa 2: adicione o código abaixo no arquivo ConfigureServices of Startup.cs

services.AddControllersWithViews (). AddRazorRuntimeCompilation ();

Salve a página e atualize o navegador do cliente.

Se você estiver usando o Razor, adicione o código para services.AddRazorPages (). AddRazorRuntimeCompilation ();

psuneel127
fonte
7

No .NET Core 3.1, você precisa desabilitar a geração do views.dllarquivo.

  1. Adicione o código abaixo ao seu .csprojarquivo (na raiz do seu projeto):

    <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 o pacote abaixo do Gerenciador de Pacotes NuGet para a Solução.

    Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation
    
  3. Adicione o código abaixo ao ConfigureServicesmétodo do seu Startup.csarquivo:

    services.AddMvc().AddRazorRuntimeCompilation();
    

    Ou

    services.AddControllersWithViews().AddRazorRuntimeCompilation();
    

    Ou

    services.AddRazorPages().AddRazorRuntimeCompilation();
    

Depois disso, publique novamente e execute-o. Vai funcionar.

Ali Rasouli
fonte
6

Apenas uma observação adicional - você pode querer ativar apenas condicionalmente esta compilação de tempo de execução, para que a saída publicada:

  • Usa visualizações compiladas.
  • É menor em tamanho.
  • Não habilita observadores de arquivos em produção.

Habilitar condicionalmente a compilação em tempo de execução

BryanCass
fonte
2

A maneira mais simples de configurar a compilação de tempo de execução apenas para desenvolvimento local é atualizar os perfis de inicialização em launchSettings.json. Este método não requer alterações de código para configurar um projeto que está sendo executado localmente (não afetará sua produção).

Veja a documentação oficial :

  1. Instale o pacote NuGet Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation .
  2. Modifique a seção environmentVariables do perfil de inicialização em launchSettings.json:
    • Verifique se ASPNETCORE_ENVIRONMENTestá definido como "Desenvolvimento".
    • Defina ASPNETCORE_HOSTINGSTARTUPASSEMBLIEScomo "Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation".

Exemplo:

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