NuGet'e giriş
Herhangi bir modern geliştirme platformu için temel bir araç, geliştiricilerin yararlı kod oluşturabileceği, paylaşabileceği ve kullanabileceği bir mekanizmadır. Bu tür kodlar genellikle bu paketleri kullanan projelerde gereken diğer içeriklerle birlikte derlenmiş kod (DLL'ler olarak) içeren "paketler" olarak paketlenmiştir.
.NET için (.NET Core dahil) kod paylaşımına yönelik, Microsoft tarafından desteklenen mekanizma NuGet'dir; bu mekanizma, .NET paketlerinin nasıl oluşturulduğunu, barındırıldığını ve tüketildiğini tanımlar ve bu rollerin her biri için araçlar sağlar.
Basitçe ifade etmek gerekirse NuGet paketi, derlenmiş kod (DLL) içeren .nupkg
uzantısına sahip tek bir ZIP dosyası, bu kodla ilgili diğer dosyalar ve paketin sürüm numarası gibi bilgileri içeren açıklayıcı bir bildirimdir. Kodu paylaşılacak olan geliştiriciler, paketler oluşturur ve bunları genel veya özel bir sunucuya yayınlar. Paket tüketicileri bu paketleri uygun konaklardan alır, projelerine ekler ve sonra proje kodlarında bir paketin işlevselliğini çağırır. NuGet daha sonra tüm ara ayrıntıları işler.
NuGet, genel nuget.org ana bilgisayarının yanı sıra özel konakları desteklediğinden, nuget paketlerini kullanarak bir kuruluşa veya iş grubuna özel kodu paylaşabilirsiniz. NuGet paketlerini, yalnızca kendi projelerinizde kullanılmak üzere kodunuzu düzenlemenin kullanışlı bir yolu olarak da kullanabilirsiniz. Kısacası, NuGet paketi paylaşılabilir bir kod birimidir, ancak belirli bir paylaşım yöntemi gerektirmez veya ima etmez.
Oluşturucular, konaklar ve tüketiciler arasındaki paket akışı
NuGet, genel konak rolünde nuget.org'de 100.000'den fazla benzersiz paketin merkezi deposunu tutar. Bu paketler her gün milyonlarca .NET/.NET Core geliştiricisi tarafından güncelleştirilir. NuGet ayrıca paketleri özel olarak bulutta (Azure DevOps gibi), özel bir ağda veya hatta yalnızca yerel dosya sisteminizde barındırmanıza olanak tanır. Bunu yaptığınızda, bu paketler yalnızca konağa erişimi olan geliştiricilerin kullanımına sunulur ve bu sayede paketleri belirli bir tüketici grubunun kullanımına sunabilirsiniz. Seçenekler, Kendi NuGet akışlarınızı barındırmabölümünde açıklanmıştır. Yapılandırma seçenekleri aracılığıyla, belirli bir bilgisayar tarafından tam olarak hangi konaklara erişilebileceğini de denetleyebilir ve böylece paketlerin nuget.org gibi bir genel depo yerine belirli kaynaklardan alındığından emin olabilirsiniz.
Doğası ne olursa olsun, bir konak paket oluşturucuları ve paket tüketicileriarasındaki bağlantı noktası görevi görür. Yaratıcılar yararlı NuGet paketleri oluşturur ve bunları bir depoya yayımlar. Tüketiciler daha sonra erişilebilir konaklarda yararlı ve uyumlu paketler arar, bu paketleri indirir ve projelerine ekler. Bir projeye yüklendikten sonra paketlerin API'leri proje kodunun geri kalanında kullanılabilir.
Paket hedefleme uyumluluğu
"Uyumlu" paket, tüketen projenin hedef çerçevesiyle uyumlu en az bir hedef .NET çerçevesi için oluşturulmuş derlemeler içerdiği anlamına gelir. Geliştiriciler, UWP denetimlerinde olduğu gibi tek bir çerçeveye özgü paketler oluşturabilir veya daha geniş bir hedef aralığını destekleyebilir. Bir paketin uyumluluğunu en üst düzeye çıkarmak için geliştiriciler, tüm .NET ve .NET Core projelerinin kullanabileceği .NET Standard hedeflemektedir. Tüm tüketen projeler için tek bir paket (genellikle tek bir derleme içeren) çalıştığından, bu hem oluşturucular hem de tüketiciler için en verimli yöntemdir.
Diğer yandan, .NET Standard dışında API'lere ihtiyaç duyan paket geliştiricileri, desteklemek istedikleri farklı hedef çerçeveler için ayrı derlemeler oluşturur ve bu derlemelerin tümünü aynı pakete ekler ("çoklu hedefleme" olarak adlandırılır). Bir tüketici böyle bir paket yüklediğinde NuGet yalnızca proje tarafından gerekli olan derlemeleri ayıklar. Bu, paketin söz konusu proje tarafından üretilen son uygulama ve/veya derlemelerdeki ayak izini en aza indirir. Çoklu hedefleme paketinin yaratıcısı için bakımını yapmak elbette daha zordur.
Dikkat
Uygulama bileşenleri ve yeniden kullanılabilir kitaplıklar hakkında yönergeler için konusunun .NET Standardbelgelerine bakın.
NuGet araçları
NuGet, barındırma desteğine ek olarak hem oluşturucular hem de tüketiciler tarafından kullanılan çeşitli araçlar sağlar. Belirli araçları elde etmek için bkz. NuGet istemci araçlarını yükleme .
Araç | Platformlar | Geçerli Senaryolar | Açıklama |
---|---|---|---|
dotnet CLI | Tüm | Oluşturma, Tüketim | .NET Core ve .NET Standard kütüphaneleri için Komut Satırı Aracı ve .NET Framework'ü hedefleyen SDK tarzı projeler için (bkz. SDK özniteliği). Belirli NuGet CLI özelliklerini doğrudan .NET Core araç zinciri içinde sağlar.
nuget.exe CLI'da olduğu gibi, dotnet CLI Visual Studio projeleriyle etkileşim kurmaz. |
nuget.exe CLI | Tüm | Oluşturma, Tüketim | .NET Framework kitaplıkları ve .NET Standart kitaplıklarını hedefleyen SDK stili olmayan projeler için CLI aracı. Bazı komutlar özellikle paket oluşturucularına, bazıları yalnızca tüketicilere, bazıları da her ikisine de uygulanırken tüm NuGet özelliklerini sağlar. Örneğin, paket oluşturucuları çeşitli derlemelerden ve ilgili dosyalardan paket oluşturmak için nuget pack komutunu kullanır, paket tüketicileri paketleri proje klasörüne eklemek için nuget install kullanır ve herkes NuGet yapılandırma değişkenlerini ayarlamak için nuget config kullanır. Platformdan bağımsız bir araç olarak NuGet CLI, Visual Studio projeleriyle etkileşim kurmaz. |
Paket Yöneticisi Konsolu | Windows üzerinde Visual Studio | Tüketim | Visual Studio projelerinde paketleri yüklemek ve yönetmek için PowerShell komutları sağlar. |
paket yöneticisi kullanıcı arabirimi | Windows üzerinde Visual Studio | Tüketim | Visual Studio projelerinde paketleri yüklemek ve yönetmek için kullanımı kolay bir kullanıcı arabirimi sağlar. |
NuGet Kullanıcı Arabirimini Yönetme | Mac için Visual Studio | Tüketim | Mac için Visual Studio projelerinde paketleri yüklemek ve yönetmek için kullanımı kolay bir kullanıcı arabirimi sağlayın. |
MSBuild | Windows | Oluşturma, Tüketim | Doğrudan MSBuild araç zinciri aracılığıyla bir projede kullanılan paketleri oluşturma ve paketleri geri yükleme olanağı sağlar. |
Gördüğünüz gibi, birlikte çalıştığınız NuGet araçları, paketleri oluşturup oluşturmadığınıza, kullanıp kullanmadığınıza veya yayımlamanıza ve üzerinde çalıştığınız platforma büyük ölçüde bağlıdır. Paket oluşturucuları genellikle, diğer NuGet paketlerinde bulunan fonksiyonellik üzerine inşa ederek aynı zamanda birer tüketicidirler. Ve elbette bu paketler de diğerlerine bağlı olabilir.
Daha fazla bilgi için Paket oluşturma iş akışı ve Paket tüketimi iş akışı makaleleriyle başlayın.
Bağımlılıkları yönetme
Başkalarının işlerini kolayca geliştirme olanağı, bir paket yönetim sisteminin en güçlü özelliklerinden biridir. Buna göre, NuGet'in yaptığı çoğu şey bir proje adına bu bağımlılık ağacını veya "grafı" yönetmektir. Basitçe söylemek gerekirse, yalnızca bir projede doğrudan kullandığınız paketlerle ilgilenmeniz gerekir. Bu paketlerden herhangi biri başka paketler kullanırsa (bu da diğer paketleri tüketebilir), NuGet tüm bu alt düzey bağımlılıklarla ilgilenir.
Aşağıdaki görüntüde beş pakete bağlı olan ve daha birçok pakete bağlı olan bir proje gösterilmektedir.
için örnek bir NuGet bağımlılık grafiği
Bağımlılık grafiğinde bazı paketlerin birden çok kez göründüğüne dikkat edin. Örneğin, B paketinin üç farklı tüketicisi vardır ve her tüketici bu paket için farklı bir sürüm de belirtebilir (gösterilmez). Bu, özellikle yaygın olarak kullanılan paketler için yaygın bir durumdur. NuGet neyse ki B paketinin tam olarak hangi sürümünün tüm tüketicileri karşıladığına karar vermek için tüm zor işleri yapar. Ardından NuGet, bağımlılık grafiği ne kadar derin olursa olsun diğer tüm paketler için aynı işlemi yapar.
NuGet'in bu hizmeti nasıl gerçekleştirdiği hakkında daha fazla bilgi için bkz. Bağımlılık çözümlemesi.
Referansları takip etme ve paketleri geri yükleme
Projeler geliştirici bilgisayarları, kaynak denetimi depoları, derleme sunucuları vb. arasında kolayca hareket ettiğinden, NuGet paketlerinin ikili derlemelerini doğrudan bir projeye bağlı tutmak son derece pratik değildir. Bunun yapılması, projenin her kopyasını gereksiz yere şişirir ve bu da kaynak kontrol depolarında gereksiz alan israfına neden olur. Güncelleştirmelerin projenin tüm kopyalarına uygulanması gerekeceğinden paket ikili dosyalarını daha yeni sürümlere güncelleştirmek de çok zor olacaktır.
NuGet bunun yerine, hem üst düzey hem de alt düzey bağımlılıklar dahil olmak üzere projenin bağımlı olduğu paketlerin basit bir başvuru listesini tutar. Başka bir ifadeyle, bir konaktan projeye paket yüklediğinizde NuGet, paket tanımlayıcısını ve sürüm numarasını başvuru listesine kaydeder. (Bir paketi kaldırmak elbette listeden kaldırır.) NuGet daha sonra, Paketi geri yüklemeaçıklandığı gibi istek üzerine başvuruda bulunılan tüm paketleri geri yüklemek için bir araç sağlar.
başka bir yere geri yüklemek için kullanılabilir
NuGet, yalnızca başvuru listesiyle birlikte tüm bu paketleri daha sonra genel ve/veya özel konaklardan geri yükleyebilir ve ileride herhangi bir zamanda yeniden yükleyebilir. Bir projeyi kaynak denetimine işlerken veya başka bir şekilde paylaşırken, yalnızca başvuru listesini ekler ve paket ikili dosyalarını hariç tutarsınız (bkz. Paketler ve kaynak denetimi.)
Otomatik dağıtım sisteminin bir parçası olarak projenin kopyasını alan bir derleme sunucusu gibi bir proje alan bilgisayar, gerektiğinde NuGet'den bağımlılıkları geri yüklemesini ister. Azure DevOps gibi derleme sistemleri, tam olarak bu amaçla "NuGet geri yükleme" adımları sağlar. Benzer şekilde, geliştiriciler bir projenin kopyasını edindiğinde (depoyu kopyalarken olduğu gibi), gerekli tüm paketleri almak için nuget restore
(NuGet CLI), dotnet restore
(dotnet CLI) veya Install-Package
(Paket Yöneticisi Konsolu) gibi komutu çağırabilir. Visual Studio, proje oluştururken paketleri otomatik olarak geri yükler (paket geri yükleme açıklandığı gibi otomatik geri yüklemenin etkinleştirilmesi koşuluyla).
Bu durumda Geliştiricilerin ilgilendiği NuGet'in birincil rolü, projeniz adına bu başvuru listesini korumak ve başvuruda bulunulan paketleri verimli bir şekilde geri yüklemek (ve güncelleştirmek) için araçlar sağlamaktır. Bu liste, olarak adlandırılan ikipaket yönetimi biçiminden birinde, onlardan biri olarak tutulur:
PackageReference (veya "proje dosyalarındaki paket başvuruları") | (NuGet 4.0+), projenin en üst düzey bağımlılıklarının listesini doğrudan proje dosyasında tutar, dolayısıyla ayrı bir dosya gerekmez.
obj/project.assets.json
ilişkili bir dosya, bir projenin kullandığı paketlerin genel bağımlılık grafiğini ve tüm alt düzey bağımlılıkları yönetmek için dinamik olarak oluşturulur. PackageReference her zaman .NET Core projeleri tarafından kullanılır.packages.config
: (NuGet 1.0+) Yüklenen diğer paketlerin bağımlılıkları da dahil olmak üzere projedeki tüm bağımlılıkların düz listesini tutan bir XML dosyası. Yüklü veya geri yüklenen paketler birpackages
klasöründe depolanır.
Herhangi bir projede hangi paket yönetimi biçiminin çalıştırıldığı proje türüne ve NuGet'in (ve/veya Visual Studio) kullanılabilir sürümüne bağlıdır. Hangi biçimin kullanıldığını denetlemek için, ilk paketinizi yükledikten sonra proje kökünde packages.config
aramanız yeterlidir. Bu dosyaya sahip değilseniz proje dosyasına doğrudan <PackageReference> öğesine bakın.
Bir seçeneğiniz olduğunda PackageReference kullanmanızı öneririz.
packages.config
miras nedenleriyle korunmaktadır ve artık etkin geliştirme aşamasında değildir.
Bahşiş
nuget install
gibi çeşitli nuget.exe
CLI komutları, paketi otomatik olarak başvuru listesine eklemez. Visual Studio Paket Yöneticisi (UI veya Konsol) ve dotnet.exe
CLI ile bir paket yüklenirken liste güncelleştirilir.
NuGet başka ne yapar?
Şimdiye kadar NuGet'in aşağıdaki özelliklerini öğrendiniz:
- NuGet, merkezi nuget.org depoya özel barındırma desteği sağlar.
- NuGet, geliştiricilerin paketleri oluşturmak, yayımlamak ve tüketmek için ihtiyaç duyduğu araçları sağlar.
- En önemlisi, NuGet bir projede kullanılan paketlerin başvuru listesini ve bu paketleri bu listeden geri yükleme ve güncelleştirme özelliğini korur.
NuGet, bu işlemlerin verimli bir şekilde çalışmasını sağlamak için bazı arka planda iyileştirmeler yapar. En önemlisi, NuGet bir paket önbelleğini ve kısayol yükleme ve yeniden yükleme için genel paketler klasörünü yönetir. Önbellek, makineye zaten yüklenmiş olan bir paketin indirilmesini önler. Genel paketler klasörü, birden çok projenin aynı yüklü paketi paylaşmasına olanak sağlayarak NuGet'in bilgisayardaki genel ayak izini azaltır. Önbellek ve genel paketler klasörü, derleme sunucusunda olduğu gibi daha fazla sayıda paketi sık sık geri yüklerken de çok yararlıdır. Bu mekanizmalar hakkında daha fazla bilgi için bkz. Genel paketleri ve önbellek klasörlerini yönetme.
Tek bir projede NuGet, aynı paketin farklı sürümlerine yönelik birden çok başvuruyu çözümlemeyi de içeren genel bağımlılık grafiğini yönetir. Bir projenin aynı bağımlılıklara sahip olan bir veya daha fazla pakete bağımlılık alması oldukça yaygındır. nuget.org'da en kullanışlı yardımcı program paketlerinden bazıları diğer birçok paket tarafından kullanılır. Tüm bağımlılık grafiğinde, aynı paketin farklı sürümlerine kolayca on farklı referans bulunabilir. Bu paketin birden çok sürümünü uygulamanın kendisine getirmekten kaçınmak için NuGet, tüm tüketiciler tarafından hangi tek sürümün kullanılabileceğini sıralar. (Daha fazla bilgi için bkz. bağımlılık çözümü.)
Bunun ötesinde NuGet, paketlerin nasıl yapılandırıldığıyla ilgili tüm belirtimleri (yerelleştirme ve hata ayıklama simgeleridahil) ve bunlara nasıl başvurulduğunu (sürüm aralıkları ve sürüm öncesi sürümleridahil) korur. NuGet, hizmetleriyle program aracılığıyla çalışmak için çeşitli API'ler de sağlar ve Visual Studio uzantıları ve proje şablonları yazan geliştiriciler için destek sağlar.
Bu belgelerin içindekiler tablosuna göz atmak için biraz zaman ayırın ve nuget'in başlangıçlarına kadar uzanan sürüm notlarıyla birlikte bu özelliklerin tümünü burada görebilirsiniz.
İlgili video
Channel 9 ve YouTube'te NuGet videolarını bulun.
Açıklamalar, katkılar ve sorunlar
Son olarak, bu belgelere yapılan yorumları ve katkıları çok hoş karşılıyoruz; herhangi bir sayfanın üst kısmındaki Geri Bildirim seçin ve düzenle komutlarını veya GitHub'daki docs deposu ve docs sorun listesini ziyaret edin.
Ayrıca çeşitli GitHub depoları aracılığıyla NuGet'ekatkıları da memnuniyetle karşılıyoruz; NuGet sorunları https://github.com/NuGet/home/issuesbulunabilir.
NuGet deneyiminizin keyfini çıkarın!