Pengantar NuGet

Alat penting untuk platform pengembangan modern apa pun adalah mekanisme di mana pengembang dapat membuat, berbagi, dan menggunakan kode yang berguna. Seringkali kode tersebut dibundel ke dalam "paket" yang berisi kode yang dikompilasi (sebagai DLL) bersama dengan konten lain yang diperlukan dalam proyek yang menggunakan paket ini.

Untuk .NET (termasuk .NET Core), mekanisme yang didukung Microsoft untuk berbagi kode adalah NuGet, yang menentukan bagaimana paket untuk .NET dibuat, dihosting, dan digunakan, dan menyediakan alat untuk setiap peran tersebut.

Sederhananya, paket NuGet adalah satu file ZIP dengan .nupkg ekstensi yang berisi kode yang dikompilasi (DLL), file lain yang terkait dengan kode tersebut, dan manifes deskriptif yang mencakup informasi seperti nomor versi paket. Pengembang dengan kode untuk berbagi paket pembuatan dan menerbitkannya ke host publik atau privat. Konsumen paket mendapatkan paket tersebut dari host yang sesuai, menambahkannya ke proyek mereka, lalu memanggil fungsionalitas paket dalam kode proyek mereka. NuGet sendiri kemudian menangani semua detail perantara.

Karena NuGet mendukung host privat bersama host nuget.org publik, Anda dapat menggunakan paket NuGet untuk berbagi kode yang eksklusif untuk organisasi atau grup kerja. Anda juga dapat menggunakan paket NuGet sebagai cara mudah untuk memperhitungkan kode Anda sendiri untuk digunakan dalam apa pun kecuali proyek Anda sendiri. Singkatnya, paket NuGet adalah unit kode yang dapat dibagikan, tetapi tidak memerlukan atau menyiratkan cara berbagi tertentu.

Alur paket antara pembuat, host, dan konsumen

Dalam perannya sebagai host publik, NuGet sendiri mempertahankan repositori pusat lebih dari 100.000 paket unik di nuget.org. Paket-paket ini digunakan oleh jutaan pengembang .NET/.NET Core setiap hari. NuGet juga memungkinkan Anda untuk menghosting paket secara privat di cloud (seperti di Azure DevOps), di jaringan privat, atau bahkan hanya pada sistem file lokal Anda. Dengan demikian, paket tersebut hanya tersedia untuk pengembang yang memiliki akses ke host, memberi Anda kemampuan untuk membuat paket tersedia untuk sekelompok konsumen tertentu. Opsi dijelaskan pada Hosting umpan NuGet Anda sendiri. Melalui opsi konfigurasi, Anda juga dapat mengontrol dengan tepat host mana yang dapat diakses oleh komputer tertentu, sehingga memastikan bahwa paket diperoleh dari sumber tertentu daripada repositori publik seperti nuget.org.

Apa pun sifatnya, host berfungsi sebagai titik koneksi antara pembuat paket dan konsumen paket. Pembuat membuat paket NuGet yang berguna dan menerbitkannya ke host. Konsumen kemudian mencari paket yang berguna dan kompatibel pada host yang dapat diakses, mengunduh dan menyertakan paket tersebut dalam proyek mereka. Setelah diinstal dalam proyek, API paket tersedia untuk sisa kode proyek.

Relationship between package creators, package hosts, and package consumers

Kompatibilitas penargetan paket

Paket "kompatibel" berarti berisi rakitan yang dibangun untuk setidaknya satu kerangka kerja .NET target yang kompatibel dengan kerangka kerja target proyek yang mengkonsumsi. Pengembang dapat membuat paket yang khusus untuk satu kerangka kerja, seperti halnya kontrol UWP, atau mereka dapat mendukung berbagai target yang lebih luas. Untuk memaksimalkan kompatibilitas paket, pengembang menargetkan .NET Standard, yang dapat digunakan oleh semua proyek .NET dan .NET Core. Ini adalah cara paling efisien bagi pembuat dan konsumen, sebagai satu paket (biasanya berisi satu rakitan) berfungsi untuk semua proyek yang menggunakan.

Pengembang paket yang memerlukan API di luar .NET Standard, di sisi lain, membuat rakitan terpisah untuk kerangka kerja target yang berbeda yang ingin mereka dukung dan sertakan semua rakitan tersebut dalam paket yang sama (yang disebut "multi-penargetan"). Ketika konsumen menginstal paket seperti itu, NuGet hanya mengekstrak rakitan yang diperlukan oleh proyek. Ini meminimalkan jejak paket dalam aplikasi akhir dan/atau rakitan yang dihasilkan oleh proyek tersebut. Paket multi-penargetan tentu saja lebih sulit dipertahankan oleh pembuatnya.

Catatan

Untuk panduan tentang komponen aplikasi vs. pustaka yang dapat digunakan kembali, lihat dokumentasi .NET Standard tentang topik tersebut.

Alat NuGet

Selain dukungan hosting, NuGet juga menyediakan berbagai alat yang digunakan oleh kreator dan konsumen. Lihat Menginstal alat klien NuGet untuk cara mendapatkan alat tertentu.

Alat Platform Skenario yang Berlaku Deskripsi
dotnet CLI Semua Pembuatan, Konsumsi Alat CLI untuk pustaka .NET Core dan .NET Standard, dan untuk proyek bergaya SDK yang menargetkan .NET Framework (lihat atribut SDK). Menyediakan kemampuan NuGet CLI tertentu langsung dalam rantai alat .NET Core. Seperti halnya nuget.exe CLI, CLI dotnet tidak berinteraksi dengan proyek Visual Studio.
CLI nuget.exe Semua Pembuatan, Konsumsi Alat CLI untuk pustaka .NET Framework dan proyek gaya non-SDK yang menargetkan pustaka .NET Standard. Menyediakan semua kemampuan NuGet, dengan beberapa perintah yang berlaku khusus untuk pembuat paket, beberapa hanya berlaku untuk konsumen, dan yang lain berlaku untuk keduanya. Misalnya, pembuat paket menggunakan nuget pack perintah untuk membuat paket dari berbagai rakitan dan file terkait, paket yang digunakan nuget install konsumen untuk menyertakan paket dalam folder proyek, dan semua orang menggunakan nuget config untuk mengatur variabel konfigurasi NuGet. Sebagai alat agnostik platform, NuGet CLI tidak berinteraksi dengan proyek Visual Studio.
Konsol Manajer Paket Visual Studio di Windows Consumption Menyediakan perintah PowerShell untuk menginstal dan mengelola paket dalam proyek Visual Studio.
UI Manajer Paket Visual Studio di Windows Consumption Menyediakan UI yang mudah digunakan untuk menginstal dan mengelola paket dalam proyek Visual Studio.
Mengelola UI NuGet Visual Studio untuk Mac Consumption Menyediakan UI yang mudah digunakan untuk menginstal dan mengelola paket di proyek Visual Studio untuk Mac.
MSBuild Windows Pembuatan, Konsumsi Menyediakan kemampuan untuk membuat paket dan memulihkan paket yang digunakan dalam proyek secara langsung melalui rantai alat MSBuild.

Seperti yang Anda lihat, alat NuGet yang anda kerjakan sangat bergantung pada apakah Anda membuat, mengonsumsi, atau menerbitkan paket, dan platform tempat Anda bekerja. Pembuat paket biasanya juga konsumen, karena mereka membangun di atas fungsionalitas yang ada di paket NuGet lainnya. Dan paket-paket itu, tentu saja, pada gilirannya mungkin tergantung pada masih yang lain.

Untuk informasi selengkapnya, mulailah dengan artikel Alur kerja pembuatan paket dan Alur kerja konsumsi paket.

Mengelola dependensi

Kemampuan untuk dengan mudah membangun pekerjaan orang lain adalah salah satu fitur paling kuat dari sistem manajemen paket. Oleh karena itu, banyak dari apa yang dilakukan NuGet adalah mengelola pohon dependensi atau "grafik" atas nama proyek. Sederhananya, Anda hanya perlu khawatir dengan paket-paket yang Anda gunakan secara langsung dalam proyek. Jika salah satu paket tersebut sendiri menggunakan paket lain (yang dapat, pada gilirannya, mengonsumsi masih yang lain), NuGet mengurus semua dependensi tingkat bawah tersebut.

Gambar berikut menunjukkan proyek yang bergantung pada lima paket, yang pada gilirannya bergantung pada sejumlah lainnya.

An example NuGet dependency graph for a .NET project

Perhatikan bahwa beberapa paket muncul beberapa kali dalam grafik dependensi. Misalnya, ada tiga konsumen paket B yang berbeda, dan setiap konsumen mungkin juga menentukan versi yang berbeda untuk paket tersebut (tidak ditampilkan). Ini adalah kejadian umum, terutama untuk paket yang banyak digunakan. NuGet untungnya melakukan semua kerja keras untuk menentukan dengan tepat versi paket B mana yang memuaskan semua konsumen. NuGet kemudian melakukan hal yang sama untuk semua paket lainnya, tidak peduli seberapa dalam grafik dependensi.

Untuk detail selengkapnya tentang cara NuGet melakukan layanan ini, lihat Resolusi dependensi.

Melacak referensi dan memulihkan paket

Karena proyek dapat dengan mudah berpindah antar komputer pengembang, repositori kontrol sumber, membangun server, dan sebagainya, sangat tidak praktis untuk menjaga rakitan biner paket NuGet terikat langsung ke proyek. Melakukannya akan membuat setiap salinan proyek tidak perlu kembung (dan dengan demikian membuang ruang di repositori kontrol sumber). Ini juga akan membuatnya sangat sulit untuk memperbarui biner paket ke versi yang lebih baru karena pembaruan harus diterapkan di semua salinan proyek.

NuGet sebaliknya mempertahankan daftar referensi sederhana paket yang bergantung pada proyek, termasuk dependensi tingkat atas dan tingkat bawah. Artinya, setiap kali Anda menginstal paket dari beberapa host ke dalam proyek, NuGet merekam pengidentifikasi paket dan nomor versi dalam daftar referensi. (Menghapus instalasi paket, tentu saja, menghapusnya dari daftar.) NuGet kemudian menyediakan sarana untuk memulihkan semua paket yang dirujuk berdasarkan permintaan, seperti yang dijelaskan pada Pemulihan paket.

A NuGet reference list is created on package installation and can be used to restore packages elsewhere

Hanya dengan daftar referensi, NuGet kemudian dapat menginstal ulang—yaitu, memulihkan—semua paket tersebut dari host publik dan/atau privat di lain waktu. Saat menerapkan proyek ke kontrol sumber, atau membagikannya dengan cara lain, Anda hanya menyertakan daftar referensi dan mengecualikan biner paket apa pun (lihat Paket dan kontrol sumber.)

Komputer yang menerima proyek, seperti server build yang mendapatkan salinan proyek sebagai bagian dari sistem penyebaran otomatis, hanya meminta NuGet untuk memulihkan dependensi setiap kali diperlukan. Sistem build seperti Azure DevOps menyediakan langkah-langkah "pemulihan NuGet" untuk tujuan yang tepat ini. Demikian pula, ketika pengembang mendapatkan salinan proyek (seperti saat mengkloning repositori), mereka dapat memanggil perintah seperti nuget restore (NuGet CLI), dotnet restore (dotnet CLI), atau Install-Package (Package Manager Console) untuk mendapatkan semua paket yang diperlukan. Visual Studio, untuk bagiannya, secara otomatis memulihkan paket saat membangun proyek (asalkan pemulihan otomatis diaktifkan, seperti yang dijelaskan pada Pemulihan paket).

Jelas, kemudian, peran utama NuGet di mana pengembang khawatir mempertahankan daftar referensi tersebut atas nama proyek Anda dan menyediakan sarana untuk memulihkan (dan memperbarui) paket yang direferensikan secara efisien. Daftar ini dipertahankan dalam salah satu dari dua format manajemen paket, seperti yang disebut:

  • PackageReference (atau "referensi paket dalam file proyek") | (NuGet 4.0+) Mempertahankan daftar dependensi tingkat atas proyek langsung dalam file proyek, sehingga tidak diperlukan file terpisah. File terkait, obj/project.assets.json, dihasilkan secara dinamis untuk mengelola grafik dependensi keseluruhan paket yang digunakan proyek bersama dengan semua dependensi tingkat bawah. PackageReference selalu digunakan oleh proyek .NET Core.

  • packages.config: (NuGet 1.0+) File XML yang mempertahankan daftar datar semua dependensi dalam proyek, termasuk dependensi paket lain yang diinstal. Paket yang diinstal atau dipulihkan disimpan dalam packages folder.

Format manajemen paket mana yang digunakan dalam proyek tertentu tergantung pada jenis proyek, dan versi NuGet yang tersedia (dan/atau Visual Studio). Untuk memeriksa format apa yang digunakan, cukup cari packages.config di akar proyek setelah menginstal paket pertama Anda. Jika Anda tidak memiliki file tersebut, lihat di file proyek secara langsung untuk <elemen PackageReference> .

Ketika Anda memiliki pilihan, sebaiknya gunakan PackageReference. packages.config dipertahankan untuk tujuan warisan dan tidak lagi dalam pengembangan aktif.

Tip

Berbagai nuget.exe perintah CLI, seperti nuget install, jangan secara otomatis menambahkan paket ke daftar referensi. Daftar diperbarui saat menginstal paket dengan Manajer Paket Visual Studio (UI atau Konsol), dan dengan dotnet.exe CLI.

Apa lagi yang dilakukan NuGet?

Sejauh ini Anda telah mempelajari karakteristik NuGet berikut:

  • NuGet menyediakan repositori nuget.org pusat dengan dukungan untuk hosting privat.
  • NuGet menyediakan alat yang dibutuhkan pengembang untuk membuat, menerbitkan, dan menggunakan paket.
  • Yang terpenting, NuGet mempertahankan daftar referensi paket yang digunakan dalam proyek dan kemampuan untuk memulihkan dan memperbarui paket tersebut dari daftar tersebut.

Agar proses ini berfungsi secara efisien, NuGet melakukan beberapa pengoptimalan di balik layar. Terutama, NuGet mengelola cache paket dan folder paket global ke penginstalan dan penginstalan ulang pintasan. Cache menghindari pengunduhan paket yang sudah diinstal pada komputer. Folder paket global memungkinkan beberapa proyek untuk berbagi paket yang terinstal yang sama, sehingga mengurangi jejak keseluruhan NuGet di komputer. Folder cache dan paket global juga sangat membantu ketika Anda sering memulihkan sejumlah besar paket, seperti pada server build. Untuk detail selengkapnya tentang mekanisme ini, lihat Mengelola paket global dan folder cache.

Dalam proyek individual, NuGet mengelola grafik dependensi keseluruhan, yang lagi-lagi mencakup penyelesaian beberapa referensi ke versi yang berbeda dari paket yang sama. Sangat umum bahwa proyek mengambil dependensi pada satu atau beberapa paket yang memiliki dependensi yang sama. Beberapa paket utilitas yang paling berguna di nuget.org digunakan oleh banyak paket lain. Di seluruh grafik dependensi, Anda dapat dengan mudah memiliki sepuluh referensi yang berbeda ke versi yang berbeda dari paket yang sama. Untuk menghindari membawa beberapa versi paket itu ke dalam aplikasi itu sendiri, NuGet mengurutkan versi tunggal mana yang dapat digunakan oleh semua konsumen. (Untuk informasi selengkapnya, lihat Resolusi Dependensi.)

Di luar itu, NuGet mempertahankan semua spesifikasi yang terkait dengan bagaimana paket disusun (termasuk simbol pelokalan dan debug) dan bagaimana paket tersebut dirujuk(termasuk rentang versi dan versi pra-rilis.) NuGet juga menyediakan berbagai API untuk bekerja dengan layanannya secara terprogram, dan memberikan dukungan bagi pengembang yang menulis ekstensi Visual Studio dan templat proyek.

Luangkan waktu sejenak untuk menelusuri daftar isi dokumentasi ini, dan Anda melihat semua kemampuan ini diwakili di sana, bersama dengan catatan rilis yang berasal dari awal NuGet.

Temukan video NuGet lainnya di Channel 9 dan YouTube.

Komentar, kontribusi, dan masalah

Terakhir, kami sangat menyambut komentar dan kontribusi untuk dokumentasi ini—cukup pilih perintah Umpan Balik dan Edit di bagian atas halaman mana pun, atau kunjungi daftar masalah repositori dokumen dan dokumen di GitHub.

Kami juga menyambut kontribusi untuk NuGet sendiri melalui berbagai repositori GitHub-nya; Masalah NuGet dapat ditemukan di https://github.com/NuGet/home/issues.

Nikmati pengalaman NuGet Anda!