Bagikan melalui


Dependensi

Cara utama menambahkan dependensi ke pustaka .NET adalah mereferensikan paket NuGet. Referensi paket NuGet memungkinkan Anda untuk menggunakan kembali dengan cepat dan memanfaatkan fungsionalitas yang sudah ditulis, tetapi ini adalah sumber gesekan umum bagi pengembang .NET. Mengelola dependensi dengan benar bersifat penting untuk mencegah perubahan di pustaka .NET lainnya merusak pustaka .NET Anda, dan sebaliknya!

Dependensi berlian

Umum bagi proyek .NET untuk memiliki beberapa versi paket di pohon dependensinya. Misalnya, aplikasi bergantung pada dua paket NuGet, yang masing-masing bergantung pada versi paket yang sama yang berbeda. Dependensi berlian sekarang ada di grafik dependensi aplikasi.

Diamond dependency

Pada waktu build, NuGet menganalisis semua paket yang bergantung pada proyek, termasuk dependensi dari dependensi. Saat beberapa versi paket terdeteksi, aturan dievaluasi untuk memilihnya. Menyatukan paket diperlukan karena menjalankan versi assembly secara berdampingan dalam aplikasi yang sama bermasalah di .NET.

Sebagian besar dependensi berlian mudah diselesaikan; namun, mereka dapat membuat masalah dalam keadaan tertentu:

  • Referensi paket NuGet yang bertentangan mencegah versi diselesaikan selama pemulihan paket.
  • Melanggar perubahan antara versi menyebabkan bug dan pengecualian pada durasi.
  • Assembly paket diberi nama yang kuat, versi assembly berubah, dan aplikasi berjalan pada .NET Framework. Pengalihan pengikatan assembly diperlukan.

Tidak mungkin untuk mengetahui paket apa yang akan digunakan bersama paket Anda sendiri. Cara yang baik untuk mengurangi kemungkinan dependensi berlian yang merusak pustaka Anda adalah dengan meminimalkan jumlah paket yang Anda andalkan.

✔️ DO Tinjau pustaka .NET Anda untuk dependensi yang tidak perlu.

Rentang versi dependensi NuGet

Referensi paket menentukan rentang paket valid yang diizinkannya. Biasanya, versi referensi paket dalam file proyek adalah versi minimum, dan tidak ada maksimum.

<!-- Accepts any version 1.0 and above. -->
<PackageReference Include="ExamplePackage" Version="1.0" />

Aturan yang digunakan NuGet saat menyelesaikan dependensi bersifat rumit, tetapi NuGet secara default mencari versi terendah yang berlaku. NuGet lebih memilih versi terendah yang berlaku daripada menggunakan versi tertinggi yang tersedia karena yang terendah akan memiliki masalah kompatibilitas paling sedikit.

Karena aturan versi NuGet yang paling rendah yang berlaku, tidak perlu menempatkan versi atas atau rentang yang tepat pada referensi paket untuk menghindari mendapatkan versi terbaru. NuGet sudah mencoba menemukan versi terendah dan paling kompatibel untuk Anda.

<!-- Accepts 1.0 up to 1.x, but not 2.0 and higher. -->
<PackageReference Include="ExamplePackage" Version="[1.0,2.0)" />

<!-- Accepts exactly 1.0. -->
<PackageReference Include="ExamplePackage" Version="[1.0]" />

Batas versi atas akan menyebabkan NuGet gagal jika ada konflik. Misalnya, satu pustaka menerima tepatnya 1.0 sementara pustaka lain memerlukan 2.0 atau lebih tinggi. Meskipun perubahan yang melanggar mungkin telah diperkenalkan di versi 2.0, ketergantungan versi yang ketat atau batas atas menjamin kesalahan.

Diamond dependency conflict

❌ JANGAN memiliki referensi paket NuGet tanpa versi minimum.

❌ HINDARI referensi paket NuGet yang menuntut versi yang spesifik.

❌ HINDARI referensi paket NuGet dengan batas atas versi.

Untuk informasi selengkapnya lihat Penerapan versi paket.

Paket sumber bersama NuGet

Salah satu cara untuk mengurangi dependensi paket NuGet eksternal adalah dengan mereferensikan paket sumber bersama. Paket sumber bersama berisi file kode sumber yang disertakan dalam proyek saat dirujuk. Karena Anda hanya menyertakan file kode sumber yang dikompilasi dengan sisa proyek Anda, tidak ada dependensi eksternal dan kemungkinan konflik.

Paket sumber bersama sangat bagus untuk menyertakan potongan-potongan kecil fungsionalitas. Misalnya, Anda dapat mereferensikan paket sumber bersama metode pembantu untuk melakukan panggilan HTTP.

Shared source package

<PackageReference Include="Microsoft.Extensions.Buffers.Testing.Sources" PrivateAssets="All" Version="1.0" />

Shared source project

Paket sumber bersama memiliki beberapa batasan. Mereka hanya dapat dirujuk oleh PackageReference, sehingga proyek yang lebih lama packages.config dikecualikan. Selain itu, paket sumber bersama hanya dapat digunakan oleh proyek dengan bahasa yang sama. Karena keterbatasan ini, paket sumber bersama paling baik digunakan untuk berbagi fungsionalitas dalam proyek sumber terbuka.

✔️ PERTIMBANGKAN untuk mereferensikan paket sumber bersama untuk fungsionalitas kecil dan internal.

✔️ PERTIMBANGKAN untuk menjadikan paket Anda sebagai paket sumber bersama jika menyediakan fungsionalitas internal yang kecil.

✔️ DO mereferensikan paket sumber bersama dengan PrivateAssets="All".

Pengaturan ini memberi tahu NuGet bahwa paket hanya akan digunakan pada waktu pengembangan dan tidak boleh diekspos sebagai dependensi publik.

❌ JANGAN memiliki jenis paket sumber bersama di API publik Anda.

Jenis sumber bersama dikompilasi ke dalam assembly referensi dan tidak dapat ditukarkan di seluruh batas perakitan. Misalnya, IRepository jenis sumber bersama dalam satu proyek adalah jenis terpisah dari sumber bersama yang sama IRepository di proyek lain. Jenis dalam paket sumber bersama harus memiliki internal visibilitas.

❌ JANGAN mengeluarkan paket sumber bersama ke NuGet.org.

Paket sumber bersama berisi kode sumber dan hanya dapat digunakan oleh proyek dengan jenis bahasa yang sama. Misalnya, paket sumber bersama C# tidak dapat digunakan oleh aplikasi F#.

Mengeluarkan paket sumber bersama ke umpan lokal atau MyGet untuk menggunakannya secara internal dalam proyek Anda.