Microsoft.CodeAnalysis neden ASP.NET Core web sitesinde yayınlanıyor?


13

Bir ASP.NET Core MVC 3.0 web sitesi yayınlıyorum ve çıkış klasörü Microsoft.CodeAnalysiskütüphanecilere birçok dilde birçok başvuru içeriyor , birisi neden biliyor?

Tabii ki FxCopAnalyzersNuget paketi projeye kuruldu, ancak projenin daha önceki bir sürümünde yayınlanmadı, bu yüzden şimdi neden olduğunu anlamıyorum çünkü bir üretim ortamında değil, sadece dev zamanda yararlı olmalı.


Bir şekilde yayın ile ilgili derleme .net çekirdek 3 derleme ile ilgili gibi görünüyor ama emin değilim
Jonathan

Yanıtlar:


5

birçok dilde Microsoft'a çok sayıda başvuru içeriyor.

3.0 sürümünü kullandığımda aynı sorunla karşılaştım. Ama aynı zamanda olması buna yayınlanması üzerine .net çekirdek 3 derleme görünümleri nedeniyle sanmıyorum Görünüm ViewCompilation içinde release/2.1şube.


bir üretim ortamında değil, yalnızca geliştirmede faydalı olmalıdır.

  1. Doğru olduğuna inanıyorum. Bu Analizler sadece devtime olarak kullanılmalıdır.

  2. Ancak SDK'yı (3.0) manuel olarak kaldırdığımda ve en son SDK'yı tekrar yüklediğimde, artık çoğaltılamıyorum. Neden olmasın, belki şimdi düzeltildi. Başka bir nedenden kaynaklanıyor olabilir: Microsoft.CodeAnalysis kazayla bağlı diğer paketler üzerinde ek bir başvuru ekledim ). Her neyse, lütfen öncelikle SDK'nızı en son sürüme yükseltin.

  3. Başka bir önemli şey, denetleyici eklemek için Visual Studio kullanırken, Microsoft.VisualStudio.Web.CodeGeneration.Designotomatik olarak bir referans ekleyecektir . Bu Microsoft.CodeAnalysis.Commonpaketin dolaylı olarak pakete bağımlı olduğunu unutmayın . İşte Microsoft.CodeAnalysis.CommonMicrosoft .NET Derleyici Platformu ("Roslyn") tarafından kullanılan paylaşılan bir pakettir. Bu paketi indirir ve bu lib'i manuel olarak açarsanız, aşağıdakilerin olduğunu görürsünüz Microsoft.CodeAnalysis.dll:

    microsoft.codeanalysis.common.3.3.1 /
    ├───lib /
    Ets ağ ayarları standart 2.0 /
    ├─── ├─── ...
    │ ├─── Microsoft.CodeAnalysis.dll
    Microsoft.CodeAnalysis.pdb
    Microsoft.CodeAnalysis.xml
    └─── └─── ...
    ├───package /
    └─── └─── ...
    └───_rels /
    

    Bu pakete yalnızca Dev-Time'da ihtiyaç duyulur. Bu bağımlılığı kaldırmazsanız Microsoft.CodeAnalysis, yayınlama klasörünüzde ilgili dll'lerin bir sürü alırsınız .

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

    Bağımlı olan paketleri kaldırın Microsoft.CodeAnalysisve ardından Microsoft.CodeAnalysisilgili dll'leri almalısınız :

    resim açıklamasını buraya girin


hangi paketin Microsoft.CodeAnalysis'e doğrudan veya dolaylı bağımlılığı olduğunu nasıl görebilirim?
Jonathan


Tamam, Microsoft.VisualStudio.Web.CodeGeneration.Design paketinin bir bağımlılığı olan söylediğiniz gibi. PrivateAssets özelliği tümüne ayarlandığında, Microsoft.CodeAnalysis dosyaları artık yayımlanan projede değildir. Kod üretiminin hala iyi çalışıp çalışmayacağından emin değilsiniz, çünkü şimdi projenin bağımlılık listesinde paket üzerinde sarı bir üçgen var.
Jonathan

@Jonathan Bu pakete yalnızca geliştirme süresinde ihtiyacınız vardır. Aslında, iskele özelliğine ihtiyacınız yoksa, örneğin VSCode kullanarak, böyle bir bağımlılık eklemeyeceksiniz.
itminus

@Jonathan İskele gerekiyorsa, VS kullanırken, paket tekrar kurulacaktır. VSCode / CLI kullanıyorsanız, çağırmadan önce böyle bir paket eklemeniz gerekirdotnet aspnet-codegenerator controlller ...
itminus

10

Benim için, *.csprojdosyadaki bu satır sorunu bir şekilde çözdü. Hala konuşlandırıyor Microsoft.CodeAnalysis, ancak sadece en:

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

Github sorunu hakkındaki açıklamaya bakınız (Jonathon Marolf tarafından).


Bu benim için ASP.Net Core 3.0'da çalıştı ve ülke klasörlerini engelledi. İhtiyacım olmayan "çalışma zamanları" klasörünün alt klasörlerini (unix vb.) Önlemek mümkün müdür?
Gen1-1

@ Gen1-1 Lütfen .NET Core 2.1 ile ilgili bu soruya bakın: stackoverflow.com/questions/53507229/…
mrmowji

Teşekkürler. Bu yüzden yayın yaparken mümkündür, ancak sanırım sadece derlerken / derlerken boşa giden klasörleri engelleyemezsiniz.
Gen1-1

3

İşte çözümü daha kolay görmeye çalışıyorum.

Sorun, muhtemelen daha fazla kullanmaktır AddRazorRuntimeCompilation(). Daha spesifik olarak, startup.cs dosyasında, bu şekilde jilet çalışma zamanı derlemesi eklemeniz muhtemeldir:

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

ve bunu desteklemek için, web projenizin muhtemelen Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation

Bu nuget paketinin, Microsoft.CodeAnalysisyayınlama klasöründe istenmeyen tüm çıktıları üreten bir bağımlılığı vardır .

Çözüm, proje dosyasını düzenlemek ve bağımlılığı Hata Ayıklama modunda şu şekilde koşullu hale getirmektir:

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

ve startup.cs dosyasında koşullu olarak şu şekilde arayın AddRazorRuntimeCompilation():

    IMvcBuilder builder = services.AddControllersWithViews();

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

Bu, tüm bu Microsoft.CodeAnalysiskütüphanelerin yalnızca Hata Ayıklama modunda derlenirken çıkmasına neden olur . Dolayısıyla, Yayın modunu kullanarak yayınladığınızda bunlar çıktının bir parçası olmayacaktır.


1
IWebHostEnvironment (yukarıdaki örnekte Env) ConfigureServices () 'de mevcut değildir, ancak bunu oldukça kolay bir şekilde açığa çıkarabilirsiniz. stackoverflow.com/questions/37660043/…
Antonio Nicolaas Teyken

@AntonioNicolaasTeyken Mükemmel bir eklenti, bu benim üzerinde parladığımı fark etmediğim önemli bir detay.
Ron C

0

Belki bu birine yardımcı olabilir, benim durumumda sorun "Microsoft.VisualStudio.Web.CodeGeneration.Desig", ".csproj" dosyasındaki paket başvurusunu ExcludeAssets = "all" içerecek şekilde değiştirmem gerekiyordu:

<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="3.1.1" ExcludeAssets="All" />
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.