web-dev-qa-db-fra.com

Pourquoi Microsoft.CodeAnalysis est-il publié avec le site Web ASP.NET Core?

Je publie un site Web ASP.NET Core MVC 3.0 et le dossier de sortie contient de nombreuses références dans de nombreuses langues à Microsoft.CodeAnalysis librairies, quelqu'un sait pourquoi?

Bien sûr, le package FxCopAnalyzers Nuget est installé sur le projet, mais il n'a pas été publié dans une version antérieure du projet, donc je ne comprends pas pourquoi il l'est maintenant car il ne devrait être utile qu'au moment du développement non dans un environnement de production.

12
Jonathan

contient de nombreuses références dans de nombreuses langues aux bibliothèques Microsoft.CodeAnalysis

J'ai rencontré le même problème lorsque j'ai utilisé la version 3.0. Mais je ne pense pas que cela soit dû au fait que .net core 3 compile des vues sur la publication car il y a aussi View ViewCompilation dans le release/2.1 branche .


il ne devrait être utile qu'au moment du développement et non dans un environnement de production.

  1. Je pense que vous avez raison. Ces analyses doivent être utilisées uniquement lors du développement.

  2. Mais lorsque je désinstalle le SDK (3.0) manuellement et réinstalle le dernier SDK , je ne peux plus ne pas reproduire. Je ne sais pas pourquoi cela se produit, peut-être qu'il a été corrigé maintenant. Cela est probablement dû à une autre raison: j'ai ajouté une référence supplémentaire sur d'autres packages qui dépend de Microsoft.CodeAnalysis par accident). Quoi qu'il en soit, veuillez d'abord mettre à niveau votre SDK vers la dernière version.

  3. Une autre chose importante est que lorsque vous utilisez Visual Studio pour ajouter un contrôleur, il ajoutera une référence sur Microsoft.VisualStudio.Web.CodeGeneration.Design automatiquement. Notez que ce package a une dépendance sur Microsoft.CodeAnalysis.Common package indirectement. Ici le Microsoft.CodeAnalysis.Common est un package partagé utilisé par la plate-forme du compilateur Microsoft .NET ("Roslyn"). Si vous téléchargez ce package et décompressez cette lib manuellement, vous constaterez qu'il y a un Microsoft.CodeAnalysis.dll:

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

    Ce package n'est nécessaire que pour Dev-Time. Si vous ne supprimez pas cette dépendance, vous obtiendrez un grand nombre de DLL liées à Microsoft.CodeAnalysis dans votre dossier de publication.

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

    Supprimez les packages qui dépendent de Microsoft.CodeAnalysis, et vous ne devriez pas obtenir de Microsoft.CodeAnalysis DLL liées:

    enter image description here

5
itminus

Pour moi, cette ligne à l'intérieur *.csproj file a résolu le problème d'une manière ou d'une autre. Il déploie toujours le Microsoft.CodeAnalysis, mais uniquement pour en:

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

Voir le commentaire (par Jonathon Marolf) sur la question Github.

6
mrmowji

Voici ma façon d'essayer de rendre la solution plus facile à voir.

Le problème, plus que probable, est l'utilisation de AddRazorRuntimeCompilation(). Plus précisément, dans startup.cs, vous ajouterez probablement une compilation d'exécution de rasoir comme ceci:

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

et pour soutenir cela, votre projet web a probablement une référence à Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation

Ce paquet nuget a une dépendance sur Microsoft.CodeAnalysis Qui produit toute cette sortie indésirable dans le dossier de publication.

Le correctif consiste à modifier le fichier de projet et à conditionner la dépendance au mode débogage comme suit:

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

puis dans le fichier startup.cs appeler conditionnellement AddRazorRuntimeCompilation() comme ceci:

    IMvcBuilder builder = services.AddControllersWithViews();

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

Cela provoquera la sortie de toutes ces bibliothèques Microsoft.CodeAnalysis Uniquement lors de la compilation en mode débogage. Alors maintenant, lorsque vous publiez en utilisant le mode Release, ils ne feront pas partie de la sortie.

2
Ron C

Peut-être que cela peut aider quelqu'un, dans mon cas, le problème était "Microsoft.VisualStudio.Web.CodeGeneration.Desig", je devais changer la référence du package dans le fichier ".csproj" pour inclure ExcludeAssets = "all":

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