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

13

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 aux Microsoft.CodeAnalysisbibliothèques, quelqu'un sait pourquoi?

Bien sûr, le FxCopAnalyzerspackage 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, pas dans un environnement de production.

Jonathan
la source
Cela semble être en quelque sorte lié à la compilation de vues sur la publication .net core 3, mais je ne suis pas sûr
Jonathan

Réponses:

5

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 la release/2.1branche.


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 que je réinstalle le dernier SDK , je ne peux plus 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 Microsoft.VisualStudio.Web.CodeGeneration.Designautomatiquement une référence . Notez que ce package dépend Microsoft.CodeAnalysis.Commonindirectement du package. Voici Microsoft.CodeAnalysis.Commonun 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 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.CodeAnalysisvotre 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 en dépendent Microsoft.CodeAnalysis, et vous ne devriez obtenir aucune Microsoft.CodeAnalysisDLL associée:

    entrez la description de l'image ici

itminus
la source
comment puis-je voir quel package a une dépendance directe ou indirecte à Microsoft.CodeAnalysis?
Jonathan
ok, c'est comme vous l'avez dit le package Microsoft.VisualStudio.Web.CodeGeneration.Design qui a une dépendance à ce sujet. En définissant la propriété PrivateAssets sur all, les fichiers Microsoft.CodeAnalysis ne figurent plus dans le projet publié. Je ne sais pas si la génération de code fonctionnera toujours bien, car il y a maintenant un triangle jaune sur le package dans la liste des dépendances du projet.
Jonathan
@Jonathan Vous n'avez besoin de ce package que pendant le temps de développement. En fait, si vous n'avez pas besoin de la fonction d'échafaudage, par exemple en utilisant VSCode, vous n'ajouterez pas une telle dépendance du tout.
itminus
@Jonathan Si vous avez besoin d'échafaudage, lors de l'utilisation de VS, le package sera réinstallé. Si vous utilisez VSCode / CLI, vous devez ajouter un tel package avant d'invoquerdotnet aspnet-codegenerator controlller ...
itminus
10

Pour moi, cette ligne dans le *.csprojfichier 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 le problème Github.

mrmowji
la source
Cela a fonctionné pour moi sur ASP.Net Core 3.0 et a empêché les dossiers de pays. Est-il possible d'empêcher les sous-dossiers du dossier "runtimes" dont je n'ai pas besoin (unix, etc.)?
Gen1-1
@ Gen1-1 Veuillez voir cette question concernant .NET Core 2.1: stackoverflow.com/questions/53507229/…
mrmowji
Merci. C'est donc possible lors de la publication, mais je suppose que vous ne pouvez pas empêcher les dossiers gaspillés lors de la construction / compilation.
Gen1-1
3

Voici mon point de vue pour essayer de rendre la solution plus facile à voir.

Le problème, plus que probable, est l'utilisation de AddRazorRuntimeCompilation(). Plus précisément, dans le 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 Microsoft.CodeAnalysisqui 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 entraînera la disparition de toutes ces Microsoft.CodeAnalysisbibliothèques 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.

Ron C
la source
1
IWebHostEnvironment (Env dans l'exemple ci-dessus) n'est pas facilement disponible dans ConfigureServices (), vous pouvez cependant le révéler assez facilement. stackoverflow.com/questions/37660043/…
Antonio Nicolaas Teyken
@AntonioNicolaasTeyken Excellent ajout, c'est un détail important que je ne savais pas avoir passé sous silence.
Ron C
0

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" />
Eduardo Teixeira
la source