Perché Microsoft.CodeAnalysis è pubblicato con il sito Web ASP.NET Core?


13

Sto pubblicando un sito Web ASP.NET Core MVC 3.0 e la cartella di output contiene molti riferimenti in Microsoft.CodeAnalysislibrairies in molte lingue , qualcuno sa perché?

Ovviamente il FxCopAnalyzerspacchetto Nuget è installato sul progetto, ma non è stato pubblicato in una versione precedente del progetto, quindi non capisco perché sia ​​adesso poiché dovrebbe essere utile solo al momento dello sviluppo e non in un ambiente di produzione.


Sembra in qualche modo correlato alle visualizzazioni di compilazione di .net core 3 sulla pubblicazione, ma non ne sono sicuro
Jonathan,

Risposte:


5

contiene molti riferimenti in molte lingue alle librerie Microsoft.CodeAnalysis

Ho riscontrato lo stesso problema quando ho usato la versione 3.0. Ma non penso che sia causato dalle viste di compilazione di .net core 3 sulla pubblicazione perché c'è anche ViewCompilation nel release/2.1ramo.


dovrebbe essere utile solo in fase di sviluppo e non in un ambiente di produzione.

  1. Credo che tu abbia ragione. Queste analisi dovrebbero essere utilizzate solo in fase di sviluppo.

  2. Ma quando disinstallo manualmente l'SDK (3.0) e installo di nuovo l'ultimo SDK , non riesco più a riprodurre. Non capisco perché accada, forse è stato corretto ora. È probabilmente causato da un altro motivo: ho aggiunto un riferimento aggiuntivo su altri pacchetti che dipende da Microsoft.CodeAnalysis per caso). Ad ogni modo, per prima cosa aggiorna il tuo SDK all'ultima versione.

  3. Un'altra cosa importante è che quando si utilizza Visual Studio per aggiungere controller, verrà aggiunto Microsoft.VisualStudio.Web.CodeGeneration.Designautomaticamente un riferimento . Nota che questo pacchetto ha una dipendenza Microsoft.CodeAnalysis.Commonindirettamente dal pacchetto. Qui Microsoft.CodeAnalysis.Commonè un pacchetto condiviso utilizzato dalla piattaforma di compilatore Microsoft .NET ("Roslyn"). Se scarichi questo pacchetto e decomprimi questa lib manualmente, scoprirai che esiste un Microsoft.CodeAnalysis.dll:

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

    Questo pacchetto è necessario solo su Dev-Time. Se non rimuovi questa dipendenza, otterrai molte DLL correlate Microsoft.CodeAnalysisnella cartella di pubblicazione.

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

    Rimuovi quei pacchetti che dipendono Microsoft.CodeAnalysise quindi non dovresti ottenere Microsoft.CodeAnalysisdll correlate:

    inserisci qui la descrizione dell'immagine


come posso vedere quale pacchetto ha dipendenza diretta o indiretta da Microsoft.CodeAnalysis?
Jonathan,


ok è come hai detto il pacchetto Microsoft.VisualStudio.Web.CodeGeneration.Design che ha una dipendenza da esso. Impostando la proprietà PrivateAssets su tutti, i file Microsoft.CodeAnalysis non sono più nel progetto pubblicato. Non sono sicuro che la generazione del codice continuerà a funzionare correttamente perché ora c'è un triangolo giallo sopra il pacchetto nell'elenco delle dipendenze del progetto.
Jonathan,

@Jonathan Questo pacchetto è necessario solo durante il periodo di sviluppo. In realtà, se non hai bisogno della funzione di ponteggio, ad esempio usando VSCode, non aggiungerai affatto una dipendenza del genere.
itminus,

@Jonathan Se hai bisogno di impalcature, quando usi VS, il pacchetto verrà installato di nuovo. Se stai usando VSCode / CLI, devi aggiungere un tale pacchetto prima di invocaredotnet aspnet-codegenerator controlller ...
itminus

10

Per me, questa riga all'interno del *.csprojfile ha risolto il problema in qualche modo. Distribuisce ancora il Microsoft.CodeAnalysis, ma solo per en:

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

Vedi il commento (di Jonathon Marolf) sulla questione Github.


Questo ha funzionato per me su ASP.Net Core 3.0 e ha impedito le cartelle del paese. È possibile impedire le sottocartelle della cartella "runtime" che non mi servono (unix, ecc.)?
Gen1-1

@ Gen1-1 Si prega di vedere questa domanda per quanto riguarda .NET Nucleo 2.1: stackoverflow.com/questions/53507229/...
mrmowji

Grazie. Quindi è possibile durante la pubblicazione, ma immagino che non sia possibile impedire le cartelle sprecate durante la semplice creazione / compilazione.
Gen1-1

3

Ecco la mia idea di provare a rendere la soluzione più facile da vedere.

Il problema, più che probabilmente è l'uso di AddRazorRuntimeCompilation(). Più specificamente, in startup.cs è probabile che tu aggiunga compilation runtime razor in questo modo:

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

e per supportarlo, il tuo progetto web probabilmente ha un riferimento a Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation

Quel pacchetto nuget ha una dipendenza da Microsoft.CodeAnalysisciò che sta producendo tutto l'output indesiderato nella cartella di pubblicazione.

La correzione consiste nel modificare il file di progetto e subordinare la dipendenza alla modalità Debug in questo modo:

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

e quindi nel file startup.cs chiamare condizionalmente in questo AddRazorRuntimeCompilation()modo:

    IMvcBuilder builder = services.AddControllersWithViews();

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

Ciò farà sì che tutte quelle Microsoft.CodeAnalysislibrerie vengano disattivate solo durante la compilazione in modalità Debug. Quindi ora quando pubblichi usando la modalità di rilascio non faranno parte dell'output.


1
IWebHostEnvironment (Env nell'esempio sopra) non è prontamente disponibile in ConfigureServices (), ma puoi rivelarlo abbastanza facilmente. stackoverflow.com/questions/37660043/...
Antonio Nicolaas Teyken

@AntonioNicolaasTeyken Ottima aggiunta, questo è un dettaglio importante che non mi ero reso conto di aver sorpreso.
Ron C

0

Forse questo può aiutare qualcuno, nel mio caso il problema era "Microsoft.VisualStudio.Web.CodeGeneration.Desig", avevo bisogno di cambiare il riferimento del pacchetto nel file ".csproj" per includere ExcludeAssets = "all":

<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="3.1.1" ExcludeAssets="All" />
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.