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.

Jonathan
źródło
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

itminus
źródło
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.

mrmowji
źródło
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.

Ron C.
źródło
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" />
Eduardo Teixeira
źródło