Por que o Microsoft.CodeAnalysis é publicado no site ASP.NET Core?

13

Estou publicando um site do ASP.NET Core MVC 3.0 e a pasta de saída contém muitas referências em vários idiomas para Microsoft.CodeAnalysislibrairies, alguém sabe por quê?

É claro que o FxCopAnalyzerspacote Nuget está instalado no projeto, mas não foi publicado em uma versão anterior do projeto, então não entendo por que é agora, pois ele deve ser útil apenas no momento do desenvolvimento, não em um ambiente de produção.

Jonathan
fonte
Parece ser de alguma forma relacionada com .net núcleo 3 compilar pontos de vista sobre a publicação, mas não tenho certeza
Jonathan

Respostas:

5

contém muitas referências em muitos idiomas para o Microsoft.CodeAnalysis librairies

Eu encontrei o mesmo problema quando usei a versão 3.0. Mas acho que não foi causado pela compilação de visualizações .net core 3 na publicação, porque também há View ViewCompilation na release/2.1ramificação.


deve ser útil apenas no momento do desenvolvimento, não em um ambiente de produção.

  1. Eu acredito que você está correto. Essas análises devem ser usadas apenas no tempo de devoção.

  2. Mas quando desinstalo o SDK (3.0) manualmente e instalo o SDK mais recente novamente , não consigo mais reproduzir. Não sei por que isso acontece, talvez tenha sido corrigido agora. É mais provável que seja causado por outro motivo: eu adicionei uma referência extra em outros pacotes que dependem do Microsoft.CodeAnalysis por acidente). De qualquer forma, atualize seu SDK para a versão mais recente primeiro.

  3. Outra coisa importante é que, ao usar o Visual Studio para adicionar um controlador, ele adicionará uma referência Microsoft.VisualStudio.Web.CodeGeneration.Designautomaticamente. Observe que este pacote depende Microsoft.CodeAnalysis.Commonindiretamente do pacote. Aqui Microsoft.CodeAnalysis.Commonestá um pacote compartilhado usado pela Microsoft .NET Compiler Platform ("Roslyn"). Se você baixar este pacote e descompactar esta lib manualmente, verá que há Microsoft.CodeAnalysis.dll:

    microsoft.codeanalysis.common.3.3.1 /
    ├───lib /
    │ └───netstandard2.0 /
    │ ├─── ...Microsoft 
    ├─── Microsoft.CodeAnalysis.dll
    Microsoft ├─── Microsoft.CodeAnalysis.pdb
    Microsoft ├─── Microsoft.CodeAnalysis.xml
    │ └─── ...
    ├───package /
    │ └─── ...
    └───_rels /
    

    Este pacote é necessário apenas no Dev-Time. Se você não remover essa dependência, receberá muitas DLLs relacionadas à Microsoft.CodeAnalysissua pasta de publicação.

    <ItemGroup>
        <!-- this is not necessary when publishing -->
        <PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="3.0.0" />
    </ItemGroup>

    Remova os pacotes que dependem Microsoft.CodeAnalysise, em seguida, você não deverá obter Microsoft.CodeAnalysisdlls relacionadas:

    insira a descrição da imagem aqui

itminus
fonte
como posso ver qual pacote tem dependência direta ou indireta do Microsoft.CodeAnalysis?
15139 Jonathan
ok, é como você disse que o pacote Microsoft.VisualStudio.Web.CodeGeneration.Design que depende dele. Ao definir a propriedade PrivateAssets como all, os arquivos Microsoft.CodeAnalysis não estão mais no projeto publicado. Apenas não tenho certeza se a geração de código ainda funcionará bem, porque agora há um triângulo amarelo sobre o pacote na lista de dependências do projeto.
Jonathan
@ Jonathan Você só precisa deste pacote durante o tempo de desenvolvimento. Na verdade, se você não precisar do recurso de andaimes, por exemplo, usando o VSCode, você não adicionará essa dependência.
itminus
@ Jonathan Se você precisar de andaimes, ao usar o VS, o pacote será instalado novamente. Se você estiver usando o VSCode / CLI, precisará adicionar um pacote antes de chamardotnet aspnet-codegenerator controlller ...
itminus 15/10/19
10

Para mim, essa linha dentro do *.csprojarquivo resolveu o problema de alguma forma. Ele ainda implementa o Microsoft.CodeAnalysis, mas apenas para en:

<PropertyGroup>
  <!-- ... -->
  <SatelliteResourceLanguages>en</SatelliteResourceLanguages>
</PropertyGroup>

Veja o comentário (de Jonathon Marolf) sobre a questão do Github.

mrmowji
fonte
Isso funcionou para mim no ASP.Net Core 3.0 e impediu as pastas do país. É possível impedir as subpastas da pasta "durações" que eu não preciso (unix, etc.)?
Gen1-1 2/02
@ Gen1-1 Por favor, consulte esta pergunta sobre o .NET Core 2.1: stackoverflow.com/questions/53507229/…
mrmowji 03/02
Obrigado. Portanto, é possível ao publicar, mas acho que você não pode impedir as pastas desperdiçadas ao simplesmente criar / compilar.
Gen1-1 3/03
3

Aqui está minha opinião sobre como tornar a solução mais fácil de ver.

O problema, mais do que provável, é o uso de AddRazorRuntimeCompilation(). Mais especificamente, no startup.cs é provável que você adicione a compilação do razor runtime da seguinte forma:

     IMvcBuilder builder = services.AddControllersWithViews()
                          .AddRazorRuntimeCompilation(); 

e, para apoiar isso, seu projeto da web provavelmente tem uma referência a Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation

Esse pacote de pepitas depende de Microsoft.CodeAnalysisque está produzindo toda essa saída indesejada na pasta de publicação.

A correção é editar o arquivo do projeto e tornar a dependência condicional no modo de depuração da seguinte maneira:

    <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation" 
Version="3.1.0" Condition="'$(Configuration)' == 'Debug'" />
  </ItemGroup>

e, em seguida, no arquivo startup.cs chame condicionalmente da seguinte AddRazorRuntimeCompilation()maneira:

    IMvcBuilder builder = services.AddControllersWithViews();

     #if DEBUG
            if (Env.IsDevelopment()) {
                builder.AddRazorRuntimeCompilation();
            }
      #endif

Isso fará com que todas essas Microsoft.CodeAnalysislibrairies fiquem fora apenas quando compilar no modo Debug. Portanto, agora quando você publicar usando o modo Release, eles não farão parte da saída.

Ron C
fonte
11
IWebHostEnvironment (Env no exemplo acima) não está prontamente disponível em ConfigureServices (), você pode revelá-lo facilmente. stackoverflow.com/questions/37660043/…
Antonio Nicolaas Teyken
@AntonioNicolaasTeyken Excelente adição, esse é um detalhe importante que eu não percebi que havia encoberto.
Ron C
0

Talvez isso possa ajudar alguém, no meu caso o problema era "Microsoft.VisualStudio.Web.CodeGeneration.Desig", eu precisava alterar a referência do pacote no arquivo ".csproj" para incluir ExcludeAssets = "all":

<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="3.1.1" ExcludeAssets="All" />
Eduardo Teixeira
fonte