AspNet Core ile Kendi Nuget Paketimizi Oluşturalım.

Adem Olguner
Devops Türkiye☁️ 🐧 🐳 ☸️
8 min readMay 2, 2020

Bazen birşeyi farklı yollarla yapmayı öğrenmemiz gerekiyor, kendim için bu süreci başlattım ve elimden geldiği sürece devam ediyor olacağım…

Nuget pakete neden ihtiyaç duyarız?

Mesleki olarak okuduğum, incelediğim, dinlediğim kaynaklarda bu cümleye tekrar tekrar denk geliyordum.

Yazdığımız kodu 2.ci defa yazıyorsak, bir daha düşünmeliyiz, kod tekrarından kaçınmalıyız.

Ben de elimden geldiğince buna dikkat etmeye çalışıyorum.

Nuget paket yapmadan olmaz mı?

Olur düne kadar nasıl oluyorsa, bundan sonra olmasa da olur, ancak olsa nasıl olur birde ona bakmak lazım. Belkide avantajlarından faydalanmamız gerekiyor.

Paket yönetim sistemleri ile yazılan ve paket haline getirilen yazılımlarımızın kurulum, güncelleme, versiyon, konfigürasyon ve kaldırılması konusunda daha tutarlı olarak çalışırlar.

Paket kurulumları ek olarak bize bağımlılıklarıda (dependency) hesaba katarak yaptığımız için kütüphane ve versiyon çakışmalarının önüne geçmiş oluruz.

Paketlerimizi devam eden yazılım projelerimizde altyapı olarak kullandığımız gibi, ürün olarak sunulan yazılımlarımız içinde hizmet veriyor olacaktır.

Örnek vermek gerekirse;

  • Bir class library oluşturduk, oluşan .dll dosyamızı alıp add referance yaparak istediğimiz projeye ekleyebiliriz. Ancak versiyon tutamayız, yada versiyon tutmak için .dll dosyasının her versiyon değişikliğinde yedeklemeli ona göre kullanmalıyız.
  • Bir ürün geliştirmesi yaptığımızı düşünelim. Bu geliştirmeleri paket haline getirip satıyoruz. Müşterilerimiz bu altyapı yazılımını alıp kendi sistemleri için geliştirmeler yapmaya devam edecekler. Biz firma olarak altyapıyı güncellediğimizi ek olarak performans için işlemler eklediğimizi düşünün bunu müşterilerimize sunmak için zipleyip bütün müşterilerimize mail mi atacağız 😵
  • Bu paket yazılımımızı çalıştığımız şirket bünyesinde tüm projelerde kullanmak istediğimizi düşünelim, her proje için bir daha altyapı yazmaya başlamak ne kadar sıkıcı ve zaman kaybı olacaktır. Ancak biz bunu paket haline getirdiğimizi bir paket yükleme sisteminden indirip kurduğumuzu düşünün daha verimli ve daha hızlı olacaktır.

Paket yönetim sistemi

İşlemtim sistemleri ve teknoloji altyapılarına göre farklı Paket Yönetim Sistemleri mevcuttur.

Linux işletim sistemleri için APT, Debian tabanlı Linux dağıtımlarında kullanılan bir paket yönetim sistemidir. Benzer şekilde macOS için de MacPorts, Homebrew bilinen paket yöneticilerdir. JavaScript paketleri için npm, yarn, bower bilinen paketlerden birkaçıdır.

Paket Yönetim Sistemleri

Burada örnek olarak public bir repodan faydalanacağız. Ancak bazı durumlarda şirketimiz için veya ücretli olarak yayınlanabilecek paketlerde yapabiliriz bu durumda private repolardan faydalanmamız gerekmektedir. Private olarak paket yönetim sistemlerine buradan inceleyebiliriz.

Paket Oluşturmaya başlayalım 👊

Aslında nuget paket oluşturmak 3 veya 4 komut ile halledilebilir bir durum ancak bir proje oluşturup, oluşturduğumuz nuget paketi kullanmak üzere bir örnek yapıp inceliyor olacağız.

PROJE ADIMLARI

1 adet Class Library (.Net Core) projesi oluşturalım.

Class Library (.Net Core)

Proje içeriğinin ne olduğuna şimdilik çok takılmadan geçelim. Burada yazılanlar ihtiyacımıza göre değişkenlik gösterecektir. Ben Repository Tasarım Kalıbı ve data dönüştürme işlemi yapan ufak bir kaç şey ekledim.

Projemizi derleyelim.

NOT: Derleme işlemi Debug-Release bu fark önemli, yani hangi modda derliyorsanız projenin ayarlarını ona göre yapacağız (İlerde değineceğim)

nuget.exe

Paket oluşturma işlemlerimizi hazır hale getirelim, ilk olarak nuget.exe dosyası indirmemiz gerekiyor. Bunun için nuget.org sitesinden gerekli dosyamızı indirelim.

İndirilen nuget.exe dosyasını projemizin içerisinde [projemiz].csproj dosyası ile aynı dizine kopyalayalım.

nuget.exe

.nuspec Dosyası Oluşturalım

Nuget paketimizi oluşturabilmemiz için .nuspec uzantılı tanım dosyasına ihtiyacımız var.

nuget spec

nuget spec komutu ile .nuspec dosyamızı oluşturalım.

Oluşan .nuspec uzantılı dosyamızı istediğimiz bir uygulama ile açalım
(Visual Studio, vscode, notepad++ vb…)

Bu xml taglerinin ne anlama geldiklerine bir bakalım.

.nuspec uzantılı dosya içerisinde yer alan $id$, $version$, $title$, $author$ ve diğer değerlerine ulaşmak için,
Proje => Sağ tık => Properties > Package tabından ulaşabiliriz. Varsayılan olarak bu alanlar dikkate alınacaktır, ancak istediğimiz gibi değiştirebiliriz.

.nuspec Dosyası Attribute Değerleri ve Tanımları

Dependencies attribute alanı içerisinde projemiz içerisinde kurduğumuz paketleri ekliyoruz. (Eğer bir paket kuruldu ise, kurulu değilse boş geçebiliriz)

Files attribute değerleri içerisinde ise projemizi derlediğimizde oluşan .dll veya diğer ek dosyaların yollarını gösteriyoruz.

  • Daha önce bahsetmiş olduğum derleme türü olarak “Debug-Release” dikkat etmemiz gerekiyor cümlesi bu tanımlama için gerekli. Projemizi Release modunda derlediysek files dosyası içerisine Release klasörü içerisindeki dosyaları yol olarak gösteriyoruz.
  • Bir diğer önemli husus nuget paketimizi kullanacağımız diğer uygulamalarda da aynı şekilde nuget paket kurulurken eklediğimiz files dosyaları yine Release klasörü içerisine yüklenmeye çalışacaktır, diğer türlü hata verecektir.

.nuspec dosyamızın ayarlarını düzenleyip attribute değerlerini ayarladıktan sonra bir sonraki adımda paketimizi hazırlamak için devam edebiliriz.

Nuget.exe pack SompoTech.Nuget.csproj -Prop Configuration=Release

komutunu kullanarak nuget paketimizi hazır hale getirebiliriz.

Ve Nuget paketimiz hazır, şimdi bu hazırlamış olduğumuz paketi nuget.org’a yüklememiz gerekiyor. Yükleme işlemi için 2 farklı yol deneyebiliriz.

Nuget Paket Yükleme (1.ci Yol)

Kayıtlı bir hesabımız varsa login işlemimizi gerçekleştirelim, yoksa kayıt işlemimizi yaparak üyelik işlemimizi yapalım.

https://www.nuget.org/users/account/LogOn

Giriş işlemimizden sonra Upload Package sekmesine tıklayarak yükleme sayfasına geçelim.

Paket yükleme sayfasında oluştuduğumuz paketimizin yükleme işlemini yapalım.

Projemiz içerisinde oluşturduğumuz SompoTech.ProjectInfrastructure.1.0.0.nupkg dosyasını seçip yükle diyeceğiz.

Dosyamızı yükledikten sonra dosya nuget üzerinden bazı validasyon işlemlerinden geçtikten sonra yayına alınacaktır, bu işlem 10–15 dk gibi bir zaman sürebilir. (Validating)

Nuget.org’a gönderilen paketler virüs kontrolleri gibi çeşitli doğrulamalara tabi tutulur. (Nuget.org’daki tüm paketler periyodik olarak taranır.) Paketin tüm doğrulama kontrollerini geçmesi durumunda, dizine eklenmesi ve arama sonuçlarında görünmesi biraz zaman alabilir.

Dizin oluşturma işlemi tamamlandığında, paketin başarıyla yayınlandığını onaylayan bir e-posta alırsınız. Paket bir doğrulama denetiminde başarısız olursa, paket ayrıntıları sayfası ilişkili hatayı görüntüleyecek şekilde güncellenir ve ayrıca size bildiren bir e-posta alırsınız.

Paket doğrulama ve endeksleme genellikle 15 dakikadan az sürer. Paket yayınlama beklenenden uzun sürüyorsa, nuget.org’un herhangi bir kesinti olup olmadığını kontrol etmek için status.nuget.org adresini ziyaret ediniz.

Validating işlemi bittikten sonra paketimiz yüklendi ve kurulmaya hazır hale geldi. Paket ile ilgili bilgilere buradan erişebiliriz.

Oluşturduğumuz nuget paketi kullanmak için bir proje oluşturalım

Solution Name: NugetPaketKullanimi
Project Name: NugetPaketKullanimi.SompoTech
Tür: Console.App(.Net Core)

Nuget Paket yükleyicisinden Browse sekmesinde arattıralım. 👎

Paketi kullanmak için oluşturduğumuz yeni projede şimdi paketimizi kullanalım.

Versiyon Yükseltme

Zamanla bazı gereksinimlerimiz artacak yeni altyapı işlemleri ekleyeceğiz bu durumda var olan paketimize versiyonlar çıkarak devam edebilirz. Bunun için .nuspec uzantılı dosyamızın attribute ayarlarını tekrardan düzenleyebiliriz.

Nuget.exe pack SompoTech.Nuget.csproj -Prop Configuration=Release

Komutunu tekrar çalıştırdığımızda 1.0.1 olarak yeni bir versiyon daha oluştuğunu göreceğiz.

Daha önce nuget.org sitesinde upload işlemi yaparak yüklediğimiz paketimizi diğer bir yolla nasıl yükleyebiliriz bakalım.

Nuget Paket Yükleme (2.ci Yöntem) — Yükseltme ve API Keys Oluşturma İşlemleri

Oluşturduğumuz nuget paketlerini yüklemek için 2 yol olduğunu söylemiştik. İlk yöntem olarak Package Upload işlemi ile gerçekleştirmiştik. Şimdi 2.ci yöntem ile paket yükleme işlemini yapalım.

2.ci yöntem olarak bir komut oluşturmamız gerekiyor. Bu komut için 2 değişkene ihtiyacımız var, ilk değişken nuget paket versiyon adımız ve bu paket için oluşturulmuş uniq bir API key.

nuget.org sitesine gidelim login olalım ve API Keys sekmesine tıklayalım. Yeni bir key oluşturmamız gerekiyor. Ben key adına nuget paket adımı verdim (SompoTech.ProjectInfrastructure.Key) unutmamak ve karışmaması için bu şekilde verebilirsiniz.

API Keys alanları ve anlamları

Oluşan API Keys listesi görüntülenmektedir.

Şimdi oluşturmuş olduğumuz API Keys copy alanına tıklayarak oluşan key değerini alalım.

“dotnet nuget push bizimprojekaketiidmiz.nupkg -k Apikey -s https://api.nuget.org/v3/index.json

Bu komut ile nuget paket yükleme işlemini tamamlayacağız (Nuget.org’a paket yüklemenin 2.c. yolu)

Oluşturduğumuz komutu terminal penceresinden çalıştırarak devam edelim.

Komut çalıştırıldıktan sonra nuget.org sitesine gidelim ve login olalım Manage Packages sekmesine tıklayalım ve paket listemizi görebiliriz. Yüklemiş olduğumuz pakete ait diğer versiyonlarıda burada görebiliriz. Son yüklemeye çalıştığımız versiyon 1.0.1 versiyonu yine validating işleminden geçtikten sonra yayınlanmış olacaktır.

Projemizde Nuget Package Manager da tekrar paketimizi aradığımızda diğer versiyonlarında geldiğini görebiliriz.

Ek olarak eklediğimiz versiyonlardan bazılarında bazı sebeplerden dolayı yayından kaldırmak istediğimizde bazı ayarlar yapmamız gerekiyor.

nuget.org dan Manage Packages tıklayalım, işlem yapmak istediğimiz Nuget Paketimizin en sağdaki kalem ikonunu seçelim.

Listing sekmesin altında Selected versiyondan yayından kaldırmak istediğimiz versiyonu seçip, List in search results checkboxunun tikini kaldıralım (unchecked).

Save işleminden sonra bu versiyon Manage Nuget Packages => Browse sekmesi altında versiyonun kaldırıldığını göreceğiz.

Kendi nuget paketimizi oluşturma, yayınlama, yeni versiyon çıkarma ve versiyon kapatma işlemleri hakkında çıkarmış olduğum notları paylaştım.

Umarım faydalı olmuştur.

Başka bir konu ile görüşmek dileğiyle.

--

--