Qual o efeito da nova opção de pré-compilação durante a publicação nos aplicativos MVC4?

86

Então, recentemente atualizei o Visual Studio 2012 para a atualização 2. Veja, na próxima vez que eu for publicar meu aplicativo (via File Publish, neste caso), noto que há três novas opções:

  1. Exclua todos os arquivos existentes antes de publicar
  2. Pré-compilar durante a publicação (com um link para Configurar)
  3. Exclua arquivos da pasta App_Data

A primeira e a terceira opções são bastante autoexplicativas, mas não consigo encontrar nenhuma documentação sobre a segunda opção aplicável ao MVC. Quando eu verifico, não parece haver nenhuma mudança nos arquivos produzidos no site e não vejo nenhuma mudança real no desempenho.

Elsimer
fonte
A localização da função pode ser nova, mas a função em si não é. Mesmo que não considere a compilação de MVC, os WebForms são interoperáveis ​​em um projeto MVC.
Grant Thomas

Respostas:

85

Usar o pré-compilador ASP.NET pode ter o seguinte impacto em seu aplicativo MVC:

  • Se você tiver algo em App_Code, ele será pré-compilado em uma DLL antes da implantação. Sem a pré-compilação, isso aconteceria em tempo real pelo tempo de execução do ASP.NET.
  • Se você escolher a opção de não tornar suas páginas atualizáveis ​​(ou seja, desmarque a primeira caixa de seleção na caixa de diálogo de configurações avançadas), ele também irá pré-compilar suas visualizações (ASPX e Razor) em vez de compilá-las dinamicamente no tempo de execução. A configuração padrão (marcada) de "Permitir que o site pré-compilado seja atualizável" permite que você atualize seu conteúdo de visualização sem a necessidade de reconstruir todo o projeto.

Se você não tem nenhum arquivo em App_Code e deseja que seu site permaneça atualizável, ele não parece fazer muito.

Jimmy
fonte
7
@Elsimer Seus arquivos .cshtml ainda existirão, mas se seu conteúdo for pré-compilado, você o encontrará substituído por "Este é um arquivo de marcador gerado pela ferramenta de pré-compilação e não deve ser excluído!".
Jimmy
4
Além disso, os ganhos de desempenho ocorrem principalmente no lançamento inicial do site, quando o compilador é chamado dinamicamente para cada página. Depois que a página for acessada uma vez (e compilada), o resultado da compilação será usado nos carregamentos de página subsequentes, mesmo se você não tiver pré-compilado.
Jimmy
16
Um benefício adicional de NÃO ter suas páginas atualizáveis ​​é que o VS encontrará erros de tipo em suas visualizações antes que eles cheguem ao seu site ativo.
Chris
4
@Chris, você deve reconsiderar sua estratégia de teste se tais erros não forem detectados sem a opção de pré-compilação.
user247702
2
@ AndersLindén: Basta testar a resposta real renderizada das ações do seu controlador. Isso invocará o Razor e se gerar uma exceção, ele falhará em seu teste. No entanto, é também por isso que suas visualizações devem ser muito leves no código. Você não pode realmente fazer testes de unidade de baixa granularidade no código de exibição como faria em uma classe. É basicamente passar ou falhar e, mesmo assim, passar significa apenas que não gerou nenhuma exceção, não que realmente tenha feito o que deveria.
Chris Pratt
0

É uma pergunta antiga, mas acabo de encontrar um problema semelhante e sinto que algo vale a pena compartilhar.

Minha mensagem de erro é a mesma neste post. Meu projeto é MVC5, construído com Visual Studio 2013 profissional. Erro de compilação: o tipo 'ASP.global_asax' existe em ambas as DLLs

No meu caso, com a opção de pré-compilação, existe um arquivo, App_global.asax.dll, na pasta bin, e causa a mensagem de erro acima. Primeiro, removo App_global.asax.dll do servidor, reinicio o pool de aplicativos e o problema desaparece. Em seguida, tentei outra abordagem, desmarque a pré-compilação e republicar, reimplantar no servidor, o problema desapareceu.

flexflow
fonte