Mvc: Modos de exibição incorporados em bibliotecas de classes geram exceções de biblioteca de compilação ausentes no Azure

Criado em 24 mar. 2017  ·  3Comentários  ·  Fonte: aspnet/Mvc

Título

Carregar uma exibição incorporada em uma biblioteca de classes no Azure causa uma exceção sobre os pacotes de bibliotecas de compilação ausentes no namespace System.* ou Microsoft.* .

Impacto funcional

Exceção.

Etapas de reprodução mínimas

Criei um repositório básico para reproduzir o problema. Eu criei um aplicativo e uma biblioteca através do VS e fiz o mínimo possível para obter uma visualização incorporada na biblioteca e exibi-la parcialmente na página inicial. Deve funcionar bem se for clonado e executado no VS, mas falhará se for implantado no Azure.

https://github.com/svallis/ClassViews

Resultado esperado

Parcial renderizado corretamente.

Resultado atual

Implantado para azure o repositório de teste lança a seguinte exceção na página inicial:

InvalidOperationException: Can not find compilation library location for package 'microsoft.codeanalysis.common'
Microsoft.Extensions.DependencyModel.CompilationLibrary.ResolveReferencePaths()

Navegar para a página /Home/About sem uma parte parcial incorporada funciona corretamente.

Em meu projeto completo, estava recebendo o mesmo erro, mas com um pacote diferente:

Can not find compilation library location for package 'system.data.sqlclient'

Comentários muito úteis

MvcRazorCompileOnPublish desativa a publicação de refs assemblies destinados à compilação em tempo de execução. A ideia é que, como seu aplicativo tem visualizações pré-compiladas, você não precisaria dos refs para a compilação em tempo de execução. No entanto, suas visualizações incorporadas exigem isso. Existem duas maneiras de consertar isso

  • Cole <MvcRazorExcludeRefAssembliesFromPublish>false</MvcRazorExcludeRefAssembliesFromPublish> em seu csproj. Isso deve continuar publicando o diretório refs como parte da saída de publicação.
  • Você pode pré-compilar as visualizações na biblioteca de classes. https://github.com/aspnet/MvcPrecompilation/blob/rel/1.1.0/testapps/ClassLibraryWithPrecompiledViews/ClassLibraryWithPrecompiledViews.csproj tem um exemplo do que é necessário para pré-compilar visualizações como parte da compilação. Como seu aplicativo tem uma referência de projeto, você teria que alterar adicionalmente o WebApp para copiar a visualização pré-compilada da biblioteca para os diretórios output \ publish

Todos 3 comentários

Alguém é capaz de fornecer alguma ideia sobre isso? Presumi que fosse mais provável encontrar uma resposta aqui do que passar pelo suporte do Azure, mas fico feliz em aceitar qualquer sugestão. O mesmo código implantado em um contêiner docker fornecido pela MS funciona perfeitamente, assim como no desenvolvimento, então parece que é algo na forma como o Azure está configurado.

/ cc @pranavkm

MvcRazorCompileOnPublish desativa a publicação de refs assemblies destinados à compilação em tempo de execução. A ideia é que, como seu aplicativo tem visualizações pré-compiladas, você não precisaria dos refs para a compilação em tempo de execução. No entanto, suas visualizações incorporadas exigem isso. Existem duas maneiras de consertar isso

  • Cole <MvcRazorExcludeRefAssembliesFromPublish>false</MvcRazorExcludeRefAssembliesFromPublish> em seu csproj. Isso deve continuar publicando o diretório refs como parte da saída de publicação.
  • Você pode pré-compilar as visualizações na biblioteca de classes. https://github.com/aspnet/MvcPrecompilation/blob/rel/1.1.0/testapps/ClassLibraryWithPrecompiledViews/ClassLibraryWithPrecompiledViews.csproj tem um exemplo do que é necessário para pré-compilar visualizações como parte da compilação. Como seu aplicativo tem uma referência de projeto, você teria que alterar adicionalmente o WebApp para copiar a visualização pré-compilada da biblioteca para os diretórios output \ publish

Isso faz todo o sentido @pranavkm - muito obrigado pela explicação. Eu segui sua sugestão anterior por enquanto, vou adiar a pré-compilação das visualizações na biblioteca de classe até que esteja um pouco mais simplificada (presumo que, eventualmente, deve ser tão fácil quanto habilitar no aplicativo, basta virar um bool no csproj?)

Esta página foi útil?
0 / 5 - 0 avaliações