Dlaczego Microsoft.CodeAnalysis jest publikowany na stronie ASP.NET Core?


13

Publikuję stronę internetową ASP.NET Core MVC 3.0, a folder wyjściowy zawiera wiele odniesień w wielu językach do Microsoft.CodeAnalysislibrairies, ktoś wie dlaczego?

Oczywiście FxCopAnalyzerspakiet Nuget jest zainstalowany w projekcie, ale nie został opublikowany we wcześniejszej wersji projektu, więc nie rozumiem, dlaczego jest teraz, ponieważ powinien być użyteczny tylko w czasie projektowania, a nie w środowisku produkcyjnym.


Wydaje się, że jest to w jakiś sposób powiązane z kompilacją poglądów .net core 3 na temat publikacji, ale nie jestem pewien
— Jonathan

Odpowiedzi:


5

zawiera wiele odniesień w wielu językach do librairies Microsoft.CodeAnalysis

Ten sam problem napotkałem, gdy korzystałem z wersji 3.0. Ale nie sądzę, że jest to spowodowane kompilacją widoków .net core 3 przy publikacji, ponieważ w gałęzi znajduje się również View ViewCompilationrelease/2.1 .


powinien być użyteczny tylko w czasie projektowania, a nie w środowisku produkcyjnym.

  1. Wierzę, że masz rację. Analizy te powinny być używane tylko w czasie devtime.

  2. Ale kiedy ręcznie odinstalowuję SDK (3.0) i ponownie instaluję najnowszy SDK , nie mogę już go odtworzyć. Nie wiem, dlaczego tak się dzieje, może teraz zostało to naprawione. Jest to bardziej prawdopodobne z innego powodu: dodałem dodatkowe odniesienie do innych pakietów, które zależą od Microsoft.CodeAnalysis przez przypadek). W każdym razie najpierw zaktualizuj swój zestaw SDK do najnowszej wersji.

  3. Inną ważną rzeczą jest to, że przy użyciu programu Visual Studio w celu dodania kontrolera zostanie automatycznie dodane odwołanie Microsoft.VisualStudio.Web.CodeGeneration.Design. Uwaga: ten pakiet jest zależny od Microsoft.CodeAnalysis.Commonpakietu pośrednio. Oto Microsoft.CodeAnalysis.Commonudostępniony pakiet używany przez platformę kompilatora Microsoft .NET („Roslyn”). Jeśli pobierzesz ten pakiet i rozpakujesz tę bibliotekę ręcznie, zobaczysz, że Microsoft.CodeAnalysis.dll:

    microsoft.codeanalysis.common.3.3.1 /
    /Lib /
    │ standardnetstandard2.0 /
    │ ├─── ...
    ├─── ├─── Microsoft.CodeAnalysis.dll
    ├─── ├─── Microsoft.CodeAnalysis.pdb
    ├─── ├─── Microsoft.CodeAnalysis.xml
    │ └─── ...
    ├───opakowanie /
    │ └─── ...
    Rel_rels /
    

    Ten pakiet jest potrzebny tylko w Dev-Time. Jeśli nie usuniesz tej zależności, otrzymasz całkiem sporo bibliotek dll powiązanych z Microsoft.CodeAnalysisfolderem publikowania.

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

    Usuń te pakiety, które zależą Microsoft.CodeAnalysis, a następnie nie powinieneś dostać żadnych Microsoft.CodeAnalysispowiązanych bibliotek dll:

    wprowadź opis zdjęcia tutaj


Jak mogę zobaczyć, który pakiet ma bezpośrednią lub pośrednią zależność od Microsoft.CodeAnalysis?
— Jonathan


ok to tak, jak powiedziałeś pakiet Microsoft.VisualStudio.Web.CodeGeneration.Design, który jest od niego zależny. Po ustawieniu dla właściwości PrivateAssets wszystkich plików Microsoft.CodeAnalysis nie ma już w opublikowanym projekcie. Po prostu nie jestem pewien, czy generowanie kodu nadal będzie działało poprawnie, ponieważ teraz nad listą na liście zależności projektu znajduje się żółty trójkąt.
— Jonathan

@Jonathan Potrzebujesz tego pakietu tylko w czasie programowania. W rzeczywistości, jeśli nie potrzebujesz funkcji rusztowania, np. Używając VSCode, w ogóle nie dodasz takiej zależności.
— itminus

@Jathanathan Jeśli potrzebujesz rusztowania, podczas korzystania z VS pakiet zostanie ponownie zainstalowany. Jeśli używasz VSCode / CLI, musisz dodać taki pakiet przed wywołaniemdotnet aspnet-codegenerator controlller ...
— itminus

10

Dla mnie ten wiersz w *.csprojpliku w jakiś sposób rozwiązał problem. Nadal wdraża Microsoft.CodeAnalysis, ale tylko dla en:

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

Zobacz komentarz (autorstwa Jonathona Marolfa) w sprawie Github.


To działało dla mnie w ASP.Net Core 3.0 i zapobiegało folderom kraju. Czy można zapobiec podfolderom folderu „runtimes”, którego nie potrzebuję (unix itp.)?
— Gen1-1

@ Gen1-1 Zobacz to pytanie dotyczące .NET Core 2.1: stackoverflow.com/questions/53507229/...
— mrmowji

Dzięki. Jest to możliwe podczas publikowania, ale myślę, że nie można zapobiec zmarnowanym folderom podczas zwykłego kompilowania / kompilacji.
— Rdz 1–1

3

Oto moje starania, aby rozwiązanie było łatwiejsze do zobaczenia.

Problem, bardziej niż prawdopodobne, to użycie AddRazorRuntimeCompilation(). Mówiąc dokładniej, w startup.cs możesz dodać kompilację środowiska wykonawczego razor w następujący sposób:

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

i aby to wesprzeć, twój projekt internetowy prawdopodobnie ma odniesienie do Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation

Ten pakiet nuget jest zależny od Microsoft.CodeAnalysistego, że generuje wszystkie niechciane dane wyjściowe w folderze publikowania.

Rozwiązaniem jest edycja pliku projektu i uzależnienie zależności od trybu debugowania w następujący sposób:

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

a następnie w pliku startup.cs warunkowo wywołać AddRazorRuntimeCompilation()tak:

    IMvcBuilder builder = services.AddControllersWithViews();

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

Spowoduje to, że wszystkie te Microsoft.CodeAnalysislibrairie będą dostępne tylko podczas kompilacji w trybie debugowania. Więc teraz, kiedy publikujesz w trybie Release, nie będą one częścią danych wyjściowych.


1
IWebHostEnvironment (Env w powyższym przykładzie) nie jest łatwo dostępny w ConfigureServices (), można go jednak dość łatwo ujawnić. stackoverflow.com/questions/37660043/…
— Antonio Nicolaas Teyken

@AntonioNicolaasTeyken Doskonały dodatek, to ważny szczegół, o którym nie zdawałem sobie sprawy, że się nad nim pochwaliłem.
— Ron C

0

Może to może komuś pomóc, w moim przypadku problemem był „Microsoft.VisualStudio.Web.CodeGeneration.Desig”, musiałem zmienić odniesienie do pakietu w pliku „.csproj”, aby uwzględnić ExcludeAssets = „all”:

<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="3.1.1" ExcludeAssets="All" />
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.