Mengapa Microsoft.CodeAnalysis dipublikasikan dengan situs web ASP.NET Core?

13

Saya menerbitkan situs web ASP.NET Core MVC 3.0 dan folder keluaran berisi banyak referensi dalam banyak bahasa untuk Microsoft.CodeAnalysislibrairies, ada yang tahu mengapa?

Tentu saja FxCopAnalyzerspaket Nuget diinstal pada proyek, tetapi tidak diterbitkan dalam versi proyek sebelumnya, jadi saya tidak mengerti mengapa sekarang karena itu hanya berguna pada waktu dev tidak di lingkungan produksi.

Jonathan
sumber
Tampaknya terkait dengan .net core 3 mengkompilasi pandangan tentang publikasi tetapi saya tidak yakin
Jonathan

Jawaban:

5

berisi banyak referensi dalam banyak bahasa untuk Microsoft.CodeAnalysis librairies

Saya memang mengalami masalah yang sama ketika saya menggunakan versi 3.0. Tapi saya tidak berpikir itu disebabkan oleh .net core 3 mengkompilasi pandangan pada publikasi karena ada juga ViewCompilation di release/2.1cabang.


itu harus berguna hanya pada waktu dev tidak di lingkungan produksi.

  1. Saya yakin Anda benar. Analisis ini harus digunakan pada saat devtime saja.

  2. Tetapi ketika saya menghapus SDK (3.0) secara manual dan menginstal SDK terbaru lagi , saya tidak bisa lagi mereproduksi. Saya tidak mengapa itu terjadi, mungkin itu sudah diperbaiki sekarang. Ini lebih mungkin disebabkan oleh alasan lain: Saya menambahkan referensi tambahan pada paket lain yang tergantung pada Microsoft.CodeAnalysis secara tidak sengaja). Bagaimanapun, harap tingkatkan SDK Anda ke versi terbaru terlebih dahulu.

  3. Hal penting lainnya adalah, ketika menggunakan Visual Studio untuk menambahkan controller, itu akan menambahkan referensi Microsoft.VisualStudio.Web.CodeGeneration.Designsecara otomatis. Catatan paket ini memiliki ketergantungan pada Microsoft.CodeAnalysis.Commonpaket secara tidak langsung. Di sini Microsoft.CodeAnalysis.Commonadalah paket bersama yang digunakan oleh Microsoft .NET Compiler Platform ("Roslyn"). Jika Anda mengunduh paket ini dan unzip lib ini secara manual, Anda akan menemukan bahwa ada Microsoft.CodeAnalysis.dll:

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

    Paket ini hanya diperlukan pada Dev-Time. Jika Anda tidak menghapus ketergantungan ini, Anda akan mendapatkan cukup banyak dll yang terkait dengan Microsoft.CodeAnalysisdalam folder publikasikan Anda.

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

    Hapus paket-paket yang tergantung Microsoft.CodeAnalysis, dan Anda seharusnya tidak mendapatkan Microsoft.CodeAnalysisdll terkait:

    masukkan deskripsi gambar di sini

itminus
sumber
bagaimana saya bisa melihat paket mana yang memiliki ketergantungan langsung atau tidak langsung ke Microsoft.CodeAnalysis?
Jonathan
ok itu seperti yang Anda katakan paket Microsoft.VisualStudio.Web.CodeGeneration.Design yang memiliki ketergantungan padanya. Dengan mengatur properti PrivateAssets ke semua, file Microsoft.CodeAnalysis tidak ada dalam proyek yang diterbitkan lagi. Hanya tidak yakin apakah pembuatan kode masih akan berfungsi dengan baik karena sekarang ada segitiga kuning di atas paket dalam daftar ketergantungan proyek.
Jonathan
@ Jonathan Anda hanya membutuhkan paket ini selama masa pengembangan. Sebenarnya, jika Anda tidak memerlukan fitur perancah, misalnya menggunakan VSCode, Anda tidak akan menambahkan ketergantungan sama sekali.
itminus
@ Jonathan Jika Anda perlu perancah, saat menggunakan VS, paket akan diinstal lagi. Jika Anda menggunakan VSCode / CLI, Anda harus menambahkan paket seperti itu sebelum memohondotnet aspnet-codegenerator controlller ...
itminus
10

Bagi saya, baris di dalam *.csprojfile ini entah bagaimana menyelesaikan masalah. Itu masih menyebarkan Microsoft.CodeAnalysis, tetapi hanya untuk en:

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

Lihat komentar (oleh Jonathon Marolf) tentang masalah Github.

mrmowji
sumber
Ini bekerja untuk saya di ASP.Net Core 3.0, dan mencegah folder negara. Apakah mungkin untuk mencegah subfolder dari folder "runtimes" yang tidak saya butuhkan (unix, dll.)?
Gen1-1
@ Gen1-1 Silakan lihat pertanyaan ini mengenai .NET Core 2.1: stackoverflow.com/questions/53507229/…
mrmowji
Terima kasih. Jadi mungkin saat penerbitan, tapi saya kira Anda tidak dapat mencegah folder yang terbuang saat hanya membangun / kompilasi.
Gen1-1
3

Inilah pendapat saya untuk mencoba membuat solusi lebih mudah dilihat.

Masalahnya, kemungkinan besar adalah penggunaan AddRazorRuntimeCompilation(). Lebih khusus, di startup.cs Anda cenderung menambahkan kompilasi runtime razor seperti:

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

dan untuk mendukung itu, proyek web Anda mungkin memiliki referensi Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation

Paket nuget itu memiliki ketergantungan pada Microsoft.CodeAnalysisyang menghasilkan semua output yang tidak diinginkan dalam folder publish.

Cara mengatasinya adalah mengedit file proyek dan membuat ketergantungan bergantung pada mode Debug seperti:

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

dan kemudian dalam file startup.cs bersyarat panggilan AddRazorRuntimeCompilation()seperti:

    IMvcBuilder builder = services.AddControllersWithViews();

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

Ini akan menyebabkan semua Microsoft.CodeAnalysislibrairies hanya keluar saat kompilasi dalam mode Debug. Jadi sekarang ketika Anda mempublikasikan menggunakan mode Rilis mereka tidak akan menjadi bagian dari output.

Ron C
sumber
1
IWebHostEnvironment (Env dalam contoh di atas) tidak tersedia di ConfigureServices (), Anda dapat mengungkapkannya dengan cukup mudah. stackoverflow.com/questions/37660043/…
Antonio Nicolaas Teyken
@AntonioNicolaasTeyken Tambahan yang luar biasa, itu adalah detail penting yang saya tidak sadari telah saya bahas.
Ron C
0

Mungkin ini dapat membantu seseorang, dalam kasus saya masalahnya adalah "Microsoft.VisualStudio.Web.CodeGeneration.Desig", saya perlu mengubah referensi paket dalam file ".csproj" untuk memasukkan ExcludeAssets = "all":

<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="3.1.1" ExcludeAssets="All" />
Eduardo Teixeira
sumber