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ı için Microsoft tarafından desteklenen mekanizma NuGet'tir. Bu mekanizma .NET paketlerinin nasıl oluşturulduğunu, barındırıldığı ve tükettiğini tanımlar ve bu rollerin her biri için araçlar sağlar.
Basitçe ifade etmek gerekirse NuGet paketi, derlenmiş kodu (DLL' ler) içeren uzantılı tek bir ZIP dosyası, bu kodla .nupkg
ilgili diğer dosyalar ve paketin sürüm numarası gibi bilgileri içeren açıklayıcı bir bildirimdir. Paketleri paylaşmak ve bunları genel veya özel bir konakta yayımlamak için koda sahip geliştiriciler. 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, kendi projelerinizden başka hiçbir şeyde kullanılmamak üzere kendi kodunuzu factoriz kullanışlı bir yol olarak da kullanabilirsiniz. Kısacası, NuGet paketi paylaşılabilir bir kod birimidir, ancak belirli bir paylaşım aracı gerektirmez veya herhangi bir paylaşım aracı gerektirmez.
Oluşturucular, konaklar ve tüketiciler arasındaki paket akışı
NuGet, genel konak rolünde 100.000'den fazla benzersiz paketin merkezi deposunu nuget.org. 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ırma bö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üketicileri arasındaki bağlantı noktası olarak hizmet eder. Oluşturucular yararlı NuGet paketleri oluşturur ve bunları bir konakta 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'ı hedefler. 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 paketi, oluşturucusunun bakımını yapmak elbette daha zordur.
Not
Uygulama bileşenleri ve yeniden kullanılabilir kitaplıklar hakkında yönergeler için konu başlığındaki .NET Standard belgelerine 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ı edinme hakkında bilgi için bkz . NuGet istemci araçlarını yükleme.
Araç | Platformlar | Geçerli Senaryolar | Açıklama |
---|---|---|---|
dotnet CLI | Tümünü | Oluşturma, Tüketim | .NET Core ve .NET Standart kitaplıkları ve .NET Framework'e yönelik SDK stili projeler için CLI aracı (bkz . SDK özniteliği). Belirli NuGet CLI özelliklerini doğrudan .NET Core araç zinciri içinde sağlar. CLI'da nuget.exe olduğu gibi dotnet CLI'sı da Visual Studio projeleriyle etkileşim kurmaz. |
nuget.exe CLI | Tümünü | 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ı komutunu kullanarak nuget pack çeşitli derlemelerden ve ilgili dosyalardan bir paket oluşturur, paket tüketicileri paketleri proje klasörüne eklemek için kullanır nuget install ve herkes NuGet yapılandırma değişkenlerini ayarlamak için kullanır nuget config . 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 UI | 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 işlevleri temel alan tüketicilerdir. 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.
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.
Başvuruları izleme 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 böylece kaynak denetim depolarındaki atık alanı) oluşturur. 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.) Ardından NuGet, Paket geri yükleme bölümünde açıklandığı gibi istek üzerine başvuruda bulunılan tüm paketleri geri yüklemek için bir araç sağlar.
Yalnızca başvuru listesiyle NuGet daha sonra genel ve/veya özel konaklardan gelen tüm paketleri daha sonra yeniden yükleyebilir( yani geri 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 CLI), dotnet restore
(dotnet CLI) veya Install-Package
(Paket Yöneticisi Konsolu) gibi nuget restore
komutu çağırabilir. Visual Studio, proje oluştururken paketleri otomatik olarak geri yükler (Paket geri yükleme bölümünde 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, çağrıldıkları gibi iki paket yönetimi biçiminden birinde 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, bu nedenle ayrı bir dosya gerekmez. İlişkili bir dosya,
obj/project.assets.json
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+) Projedeki diğer yüklü paketlerin bağımlılıkları da dahil olmak üzere tüm bağımlılıkların düz listesini tutan bir XML dosyası. Yüklü veya geri yüklenen paketler birpackages
klasörde 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 packages.config
ilk paketinizi yükledikten sonra proje kökünde aramanız yeterlidir. Bu dosyaya sahip değilseniz, proje dosyasına doğrudan PackageReference <> öğesi için bakın.
Bir seçeneğiniz olduğunda PackageReference kullanmanızı öneririz. packages.config
eski amaçlarla korunur ve artık etkin geliştirme aşamasında değildir.
İpucu
gibi nuget install
çeşitli nuget.exe
CLI komutları, paketi otomatik olarak başvuru listesine eklemez. Liste, Visual Studio Paket Yöneticisi (UI veya Konsol) ve CLI ile dotnet.exe
bir paket yüklenirken 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ı başvurunuz olabilir. 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ığına (yerelleştirme ve hata ayıklama simgeleri dahil) ve bunlara nasıl başvuruldıklarına (sürüm aralıkları ve yayın öncesi sürümler dahil) ilişkin tüm belirtimleri 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'da daha fazla NuGet videosu 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 ve Düzenle komutlarını seçin veya GitHub'daki docs deposunu ve belgeleri sorun listesini ziyaret edin.
Ayrıca çeşitli GitHub depoları aracılığıyla NuGet'e yapılan katkıları da memnuniyetle karşılıyoruz; NuGet sorunları üzerinde https://github.com/NuGet/home/issuesbulunabilir.
NuGet deneyiminizin keyfini çıkarın!