.NET Versiyonlarına Uygun NuGet Paketi Oluşturmak

Bu yazıda kendi NuGet paketimizi oluşturup, farklı .NET platformlarında bunu kullanabilmeyi anlatacağım. 

Bazı kavramlara değinecek olursak,

NuGet: .NET Platformunun resmi paket yöneticisidir. İlgili siteden bir çok paketi bulabilir, bilgi alabilirsiniz. Ayrıca kendi paketlerinizi de paylaşıp, ekosisteme katkıda bulunabilirsiniz. Aşağıdaki görseli eklediğim dönemde, paketlerle ilgili istatistikler görünmekte ve giderek güncellenmektedir. NuGet sitesi için tıklayınız.
Nuget.org
Paket - Package: Derlenen kodlar (.dll dosyaları) ve bazı açıklayıcı bilgileri (kodlarla ilgili dosyaları, paketin versiyon numarası) içeren yapılardır. .nupkg uzantılı bir zip dosyasıdır.
Paketin özelliği, geliştiriciler tarafından yaratılabilir, paylaşılabilir, yayına alınabilir veya kullanılabilir.

Temel olarak paket yapısına neden ihtiyaç duyarız?

Platform Bağımsızlık: Kendi oluşturduğumuz kütüphanenin platform bağımsız kullanılmasını isteyebilirsiniz. Örnek bir problem olarak .NET Framework'te oluşturulan bir "class library"nin .NET Core'de de referans verilip kullanılmasını isteyebilirsiniz fakat versiyon farkından dolayı desteklememesinden durumundan hata verecektir.

Framework: Ortak olarak bulunan kodların farklı projelerde de kullanılmasını isteyebilir, ihtiyaç olan paketin paylaşılmasıyla işleri kolaylaştırabilirsiniz. Örnek olarak; Connection String değerinin "machine.config"den okunması. Loglama, Caching ve bazı extension yapılarının paket halinde sunulması da kullanışlı olabilir.

Bağımlılıklar: Farklı projelerde "class library"nin referans olarak kullanılmasından dolayı oluşan bağımlılıklarından dolayı güncelliğinin yönetilememesi ve kullanan projenin derlenememesi. (Bir metodun projenin güncel halinde olmaması, farklı parametre alması, ya da isminin değiştirilmesi)  

Ticari Kaygılar ve Topluluk Etkisi: İşleri kolaylaştırma noktasında yazılım ekosistemine katkıda bulunulabilir. Öyle bir paket yapılır ki para kazanmanızı sağlayabilir.

Bu makalede ağırlıklı olarak platform bağımsızlık konusu irdelenecektir. Platform bağımsızlık sorununu çözebilmek için en önemli adım, paket oluşturmak istediğimiz projenin .NET versiyonu, .NET Standard seçilmelidir. 

.NET Standard, farklı .NET uygulamalarında kullanılabilen .NET API'leri içeren ve adı gibi .NET uygulamaları arasında standart oluşturmayı hedefler. Farklı .NET uygulamalarına destek de verir. Tabi API sayıları da .NET Standard versiyonlarına ve .NET gerçekleştirmelerine göre farklılık gösterecektir. 

Yukarıdaki görselde .NET Core ve .NET Framework kullanmak isterseniz, tavsiye edilen .NET Standard versiyonu, 2.0'dır ve mevcut 37.118 API'nin 32.638'ine sahiptir. Ayrıca bu versiyonu kullanacaksanız, NET Framework versiyonu 4.7.2 ve üzerine yükseltilmesi tavsiye edilmiştir. 

.NET Standard hakkında detaylı bilgi için tıklayabilirsiniz. 

Üretilecek paketle ilgili ayarlamalar

Paketini oluşturmak istediğimiz proje, bir çok projede kullanılmaya uygun senaryo olan GenericSerializer projesidir. Bu proje, XML veya JSON formatında serialize, deserialize işlemi yapar. Generic bir yapı demek T tipinde bir dönüş tipi olmasıdır.

Projenin detaylarına girip konudan sapmamak için, repoyu incelemek isteyenler için Github linkini  bırakıyorum. 

NuGet paketi oluşturulacak projeleri .NET Standard 2.0'a ayarlamak için, projeye sağ tıklanıp Properties seçildikten sonra aşağıdaki ekrandan Target Framework seçimi yapılabilir. 

Çıkmıyorsa bilgisayarınızda yüklü olmayabilir ya da projeye çift tıkladıktan sonra açılan pencerede aşağıdaki kodu ekleyip kaydedebilirsiniz.

Paket oluşturma aşamasına gelmek için projeye sağ tıklanıp Properties seçildikten sonra aşağıdaki ekrandan "Generate NuGet package on build" seçimi yapılmalıdır. Bu işlem, derleme aşamasında NuGet paketi oluşturulmasını sağlayacaktır.

Yapılabilecek ekstra tanımlama ayarları mevcuttur.

Package Output Path: Pack ile derleme sonrasında oluşan NuGet paketlerinin konumlandıracağı klasör yoludur. Bu paketi kullanacağımız projede NuGet Package Manager alanında daha sonradan anlatılacak olan paketin kaynağı ayarlamasında bu yol kullanılacaktır. Bu yol sizin bilgisayarınızda uygun bir yol da olabilir.

Description: Paket hakkında bilgi verilir. 


Authors: Paketi yazanlar hakkında bilgi verilir.


Tags: Paket hakkında tanımlayıcı kelimeler eklenen alandır.


Package Version: Paketin versiyonunun tanımlandığı yerdir. major.minor.patch formatına uygun tanım yapılır.


Not: ön sürüm için major.minor.patch-pre-release vermemiz yeterlidir. Pack ile paketi oluşturduktan sonra NuGet Package Manager'da Include Prerelease seçeneği işaretlenirse oluşan paket görünecektir.

NuGet Paketinin oluşturulma aşaması

İki türlü yolu vardır.
  • Release modda -> Rebuild Solution ile solution derlenir ve Package Output Path ile verdiğimiz yola bu paketler oluşturulabilir. 
  • Tek bir projedeki paketi derleyeceksek; projeye sağ tıklayıp Pack sekmesine tıklanarak Package Output Path ile verdiğimiz yola seçilen projenin paketi oluşturulur.

Paketlerin kullanılacak projeye dahil edilmesi

Kullanılacak projeler, paketin amacına uygun bir şekilde .NET 7 ve .NET Framework konsol uygulamalarıdır. Yazının amacına uygun bir şekilde farklı .NET versiyonlarında çalışacak NuGet paketlerini dahil edebilmektir.

Çalışılacak Solution üzerine sağ tıklayıp -> Manage NuGet Packages for Solution seçilir.

Paketlerin kaynağı nuget.org olmayacağı için önceki projede Package Output Path olarak belirlediğimiz yeri paketlerin kaynağı -  Package source olarak seçmemiz gerekir. Alttaki görseldeki işaretli yere tıklanır.

Açılan pencereden aşağıdaki ayarlar yapılır.

Gerekli tanımlamalar yapıldıktan sonra, yeni eklenen paket kaynağı seçilir.

Seçildikten sonra önceki projeden oluşturduğumuz kaynaklar gelecektir.

Projeye dahil edilmesi aşamasında Dependencies alanında GenericSerializer.Models projesindeki referanslar gelmektedir. Base ve DataFormat projeleri de referans olarak verildiği için paket yüklenirken otomatik olarak o paketler de yüklenecektir.



Paketlerin yüklenmesi tamamlandıktan sonra, test aşamasına geçilebilir. 

.NET 7 ve .NET Framework Console uygulamalarındaki kullanımları aşağıdaki gibidir. İki projeye de paketler dahil edildi ve başarılı şekilde derlenebildi.

Özetle;

NuGet ve paket kavramlarını tanımlayıp, neden paket yapısına ihtiyaç duyduğumuza değindikten sonra paket üretimi ve farklı projelerde dahil edilmesine değinildi.

Oluşturulan paketlerin bulunduğu Github reposu için tıklayınız.

Keyifli ve faydalı olmasını umarak, çalışmalarınızda kolaylıklar diliyorum :) 

Yorumlar