Warum wird Microsoft.CodeAnalysis auf der ASP.NET Core-Website veröffentlicht?


13

Ich veröffentliche eine ASP.NET Core MVC 3.0-Website und der Ausgabeordner enthält viele Verweise in vielen Sprachen auf Microsoft.CodeAnalysisBibliotheken. Weiß jemand warum?

Natürlich ist das FxCopAnalyzersNuget-Paket auf dem Projekt installiert, aber es wurde nicht in einer früheren Version des Projekts veröffentlicht, daher verstehe ich nicht, warum es jetzt ist, da es nur zur Entwicklungszeit nützlich sein sollte, nicht in einer Produktionsumgebung.


Es scheint irgendwie damit zu tun zu haben, dass .net Core 3 Ansichten zur Veröffentlichung kompiliert, aber ich bin mir nicht sicher
Jonathan

Antworten:


5

enthält viele Verweise in vielen Sprachen auf Microsoft.CodeAnalysis librairies

Ich habe das gleiche Problem festgestellt, als ich die Version 3.0 verwendet habe. Ich glaube jedoch nicht, dass dies durch das Kompilieren von Ansichten in .net Core 3 bei Veröffentlichung verursacht wird, da sich in der Verzweigung auch View ViewCompilation befindetrelease/2.1 .


Es sollte nur zur Entwicklungszeit nützlich sein, nicht in einer Produktionsumgebung.

  1. Ich glaube du hast recht. Diese Analyse sollte nur zur Devtime verwendet werden.

  2. Wenn ich das SDK (3.0) manuell deinstalliere und das neueste SDK erneut installiere , kann ich nicht mehr reproduzieren. Ich weiß nicht, warum es passiert, vielleicht wurde es jetzt behoben. Dies ist eher auf einen anderen Grund zurückzuführen: Ich habe einen zusätzlichen Verweis auf andere Pakete hinzugefügt, der versehentlich von Microsoft.CodeAnalysis abhängt . Aktualisieren Sie Ihr SDK zunächst auf die neueste Version.

  3. Eine weitere wichtige Sache ist, dass bei Verwendung von Visual Studio zum Hinzufügen eines Controllers Microsoft.VisualStudio.Web.CodeGeneration.Designautomatisch eine Referenz hinzugefügt wird . Beachten Sie, dass dieses Microsoft.CodeAnalysis.CommonPaket indirekt von einem Paket abhängig ist . Hier Microsoft.CodeAnalysis.Commonist das ein freigegebenes Paket, das von der Microsoft .NET Compiler Platform ("Roslyn") verwendet wird. Wenn Sie dieses Paket herunterladen und diese Bibliothek manuell entpacken, werden Sie Folgendes feststellen Microsoft.CodeAnalysis.dll:

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

    Dieses Paket wird nur zur Dev-Time benötigt. Wenn Sie diese Abhängigkeit nicht entfernen, werden Microsoft.CodeAnalysisin Ihrem Veröffentlichungsordner eine ganze Reihe von DLLs angezeigt .

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

    Entfernen Sie die Pakete, die davon abhängen Microsoft.CodeAnalysis, und dann sollten Sie keine Microsoft.CodeAnalysisverwandten DLLs erhalten:

    Geben Sie hier die Bildbeschreibung ein


Wie kann ich sehen, welches Paket direkt oder indirekt von Microsoft.CodeAnalysis abhängig ist?
Jonathan


OK, es ist wie Sie sagten, das Microsoft.VisualStudio.Web.CodeGeneration.Design-Paket, das davon abhängig ist. Wenn Sie die PrivateAssets-Eigenschaft auf all setzen, befinden sich Microsoft.CodeAnalysis-Dateien nicht mehr im veröffentlichten Projekt. Ich bin mir nur nicht sicher, ob die Codegenerierung noch funktioniert, da sich jetzt ein gelbes Dreieck über dem Paket in der Abhängigkeitsliste des Projekts befindet.
Jonathan

@ Jonathan Sie benötigen dieses Paket nur während der Entwicklungszeit. Wenn Sie die Gerüstfunktion nicht benötigen, z. B. mit VSCode, fügen Sie eine solche Abhängigkeit überhaupt nicht hinzu.
Itminus

@ Jonathan Wenn Sie bei Verwendung von VS ein Gerüst benötigen, wird das Paket erneut installiert. Wenn Sie VSCode / CLI verwenden, müssen Sie ein solches Paket hinzufügen, bevor Sie es aufrufendotnet aspnet-codegenerator controlller ...
itminus

10

Für mich hat diese Zeile in der *.csprojDatei das Problem irgendwie gelöst. Es setzt immer noch die Microsoft.CodeAnalysis, aber nur für en:

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

Siehe den Kommentar (von Jonathon Marolf) zum Thema Github.


Dies funktionierte für mich unter ASP.Net Core 3.0 und verhinderte die Länderordner. Ist es möglich, die Unterordner des "Laufzeit" -Ordners zu verhindern, die ich nicht benötige (Unix usw.)?
Gen1-1

@ Gen1-1 Bitte beachten Sie diese Frage zu .NET Core 2.1: stackoverflow.com/questions/53507229/…
mrmowji

Vielen Dank. Es ist also beim Veröffentlichen möglich, aber ich denke, Sie können die verschwendeten Ordner beim einfachen Erstellen / Kompilieren nicht verhindern.
Gen1-1

3

Hier ist meine Einstellung zu dem Versuch, die Lösung besser sichtbar zu machen.

Das Problem ist höchstwahrscheinlich die Verwendung von AddRazorRuntimeCompilation(). Genauer gesagt, in der Datei startup.cs fügen Sie wahrscheinlich eine Razor-Laufzeitkompilierung wie folgt hinzu:

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

und um dies zu unterstützen, hat Ihr Webprojekt wahrscheinlich einen Verweis auf Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation

Dieses Nuget-Paket ist davon abhängig, Microsoft.CodeAnalysisdass all diese unerwünschten Ausgaben im Veröffentlichungsordner erzeugt werden.

Das Update besteht darin, die Projektdatei zu bearbeiten und die Abhängigkeit wie folgt vom Debug-Modus abhängig zu machen:

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

und dann in der Datei startup.cs bedingt AddRazorRuntimeCompilation()wie folgt aufrufen :

    IMvcBuilder builder = services.AddControllersWithViews();

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

Dies führt dazu, dass alle diese Microsoft.CodeAnalysisBibliotheken nur beim Kompilieren im Debug-Modus nicht verfügbar sind. Wenn Sie jetzt im Freigabemodus veröffentlichen, sind sie nicht Teil der Ausgabe.


1
IWebHostEnvironment (Env im obigen Beispiel) ist in ConfigureServices () nicht ohne weiteres verfügbar. Sie können es jedoch recht einfach anzeigen. stackoverflow.com/questions/37660043/…
Antonio Nicolaas Teyken

@AntonioNicolaasTeyken Ausgezeichnete Ergänzung, das ist ein wichtiges Detail, von dem ich nicht wusste, dass ich es beschönigt habe.
Ron C

0

Vielleicht kann dies jemandem helfen. In meinem Fall war das Problem "Microsoft.VisualStudio.Web.CodeGeneration.Desig". Ich musste die Paketreferenz in der Datei ".csproj" ändern, um ExcludeAssets = "all" einzuschließen:

<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="3.1.1" ExcludeAssets="All" />
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.