GitHub’da Private NuGet Package Nasıl Oluşturulur?
İnsanoğlu her zaman yiyeceklerini korumak ve saklamak istemiştir. Buzdolabı olmadığı zaman insanlar yiyeceklerini saklamak, gerektiği zaman kullanmak için çukurlar kazar içerisine bozulacak yiyeceklerini gömerlermiş. Bizim atalarımız gibi göçebe toplumlar ise at sırtında gezdikleri için genelde yiyeceklerini kuruturlarmış. Sakladıkları bu yiyecekleri daha sonrasında yerlermiş.
Aslında insanoğlu, yaşadığı süre boyunca temel amaçlarından biri yiyeceklerini her zaman taze tutmak, bir sonraki kullanıma hazır hale getirmek için saklamak istemiş…
- Peki NuGet Nedir?
.NET tarafında projenizi yazarken, yazdığınız proje kapsamına göre bazen .NET’in standart kütüphaneleri isteğinizi karşılayamayabilir. Bunun için Microsoft haricinde başkalarının da yazdığı ek kütüphanelere (3rd party) ihtiyaç duyulabilirsiniz. Bu kütüphaneler aslında başkalarının buzdolaplarıdır. Bu durumda NuGet ise bir çok buzdolabını içerisinde bulunduran bir depodur.
Yani NuGet: Başkaları tarafından yazılmış bu kütüphanelerin, projelere dahil edilmesi, kullanılması için varolan bir paket yöneticisidir.
- Peki Private NuGet Neden Gerekli?
Zamanla projeniz büyüdükçe ve projenin yanına küçük projeler daha eklendikçe ortak helperlarınızı, extensionlarınızı, bazı servislerinizi, her açtığınız projeye eklerken “Yahu ben bunların hepsini kopyalayacağım mı şimdi?” diyerek sitem ettiğiniz oluyor mu? İşte bu tür durumlar için ortak sınıflarınızı herkese açık (public) ya da sadece size özel (private) paketleyebilirsiniz ve istediğiniz projede kullanabilirsiniz. Böylece hem ortak olan kütüphanelerinizi kopyalamaz, hem de versiyonlama da yapılcağından dolayı deploy
işlemlerinde rahat etmiş olursunuz.
— Benim İçin Neden Gerekli?
Çalıştığım projede
common
adında bir katman vardı. Bu katmanda ortak olanextension
,helper
,cache
servisi,log
servisi gibi yardımcıclass
lar bulunmaktaydı. Zamanla ana projemizin yanına ufak projeciklerde yapmaya başladık. Orda dacache
,loglama
gibi yazdığımız kütüphaneler ihtiyacımız olduğunu gördük.NuGet
yapmayıp kopyalama yöntemiyle devam edelim dedik. Zamanla gördük ki bu ufak projecikler daha da artmaya başladı. Gördük ki kopyalamak bir çözüm değil, çünkü yazdığımız bu servisler her projemizin temelini oluşturuyordu. Daha sonrasında bu servisler için değişiklik yapmak gerektiğinde örneğincache
servisdemaster-slave
yapısına geçmeye kalktığımızda tüm oluşturduğumuz projelerde değişiklik yapmamız gerekecekti. Çözüm olarakcommon
katmanınıNuGet
paketi haline getirmeye karar vermiştik.
NuGet
’in ne olduğu konusuna biraz değindiğimize göre “Bir NuGet
paketini private
bir şekilde GitHub
da nasıl yayınlarım?” sorusuyla devam edelim.
dotnet new classlib --name simple_nuget
komutuyla yeni bir Class Library
tipinde proje oluşturalım. Hadi bu projeyi buzdolabımız yapalım 💪
— Class Library açmamızın nedeni: Projemizin içerisine örnek helper
ve extension
methodları yazıcağız. Amacımız yaptığımız bu classları yayınlamak olduğu için Class Library
şeklinde açtık.
Daha sonra json işlemleri için Newtonsoft.Json
kütüphanesini projemize ekleyelim. Bunun için dotnet add package Newtonsoft.Json
komutunu kullanıyoruz.
Sonrasında projemizin içerisine StringExtension
adında bir class
açalım. Bu class
ın içerisine örnek olması açısındanToConvert
ve ToDeserialize
adında iki method açalım.
Class
ı oluşturduktan sonra, paketimizi oluşturmamız için gerekli olan GitHub
ayarlarını yapabiliriz.
Bunun içinGitHub
ayarları için gerekli olan repository urli
, versiyon
, paketin adı, paketi kimin oluşturduğu bilgilerini yansıması için ayarları yapmamız gerekiyor. Bunun için projemizin dosyasını (simple_nuget.csproj) edit modunda açıyoruz.
İleride projenizde değişiklikler olduğunda paketinizin
versiyonunu
değiştirmek istediğinizde bu dosyayı yine editleyipversiyonu
elle yükseltmeniz gerekiyor.
— “RepositoryUrl” bilgisi için GitHub
dan simple_nuget
adında yeni bir private repository oluşturmamız gerekiyor.
Bunun için profil iconun yanındaki “+” iconuna tıklayıp New Repository
diyoruz.
Oluşturacağımız repository
nin private
olduğundan emin oluyoruz. Daha sonra oluşturduğumuz bu repository
nin urlini “RepositoryUrl” bilgisine yapıştırıyoruz.
Şimdi versiyonlama
için yaptığımız ayarları tamamlandığımıza göre, paketimizi GitHub
‘a pushlamamız için gerekli olan config
dosyasıyla devam ediyoruz. Bunun için nuget.config
adında bir dosya oluşturuyoruz.
— Config içerisindeki “KULLANICI_TOKEN_BILGISI” alanı için GitHub
dan kullanıcınız için token oluşturmanız gerekiyor.
Bunun için profil iconunuza tıklayın. Oradan settings
e tıklayın.
Sol menü içerisinde gelen Developer Settings
e tıklayın. Oradanda personel access tokens
a tıklayalım.
Bu sayfada oluşturulmuş tokenlarınızı görüyorsunuz. Biz NuGet
imiz için yeni bir tane key daha oluşturacağız bunun için Generate new token
butonuna tıklıyoruz.
Token bilgilerini resimdeki gibi oluşturuyoruz. Oluşan bu token bilgisini config
imize ekliyoruz.
Artık GitHub
için yaptığımız tüm ayarları tamamladık. dotnet pack
komutunu çalıştırarak paketimizi oluşturuyoruz.
Paketimizi oluşturduktan sonra, yaptığımız ayarların doğru olup olmadığını öğrenme vakti geldi. GitHub
a paketimizi göndermek için dotnet nuget push “bin/Debug/simple_nuget.1.0.0.nupkg" --source “github"
komutunu çalıştırıyoruz.
Bu komuttaki
--source “github"
çok önemli. Çünkü oluşturduğumuzconfig
dosyasını kullanmasını söylemiş oluyoruz. Peki neden “github” dedik?Çünkü
config
dosyamıza bakacak olursanızpackageSources
node’nun altında “github” adında bir key eklemiştik. Yani komutta “github” diye belirttiğimiz, bizim bu eklediğimizsource
ismi oluyor.
Böylece artık nuget paketimiz GitHub
da yerini aldı. Paketlerinize packages
tabından görebilirsiniz.
- Peki oluşturduğum paketi nasıl projeye dahil edeceğim?
Paketimizi oluşturduk, GitHub
a da yolladık. Peki ama nasıl projeye dahil edeceğim? Sorusuyla devam edelim.
Bunun için dotnet new console -name simple_nuget_console
komutunu kullanarak simple_nuget_console
adında yeni bir console
uygulaması açalım.
Projeyi oluşturduktan sonra, NuGet
paketi olarak GitHub
ı da kullanacağımızı .Net
tarafına söylememiz gerekiyor. Bunun için dotnet nuget add source https://nuget.pkg.github.com/KULLANICI_ADI/index.json -n "GitHub" -u KULLANICI_ADI -p TOKEN --store-password-in-clear-text
komutunu çalıştırıyoruz.
Böylece NuGet
kaynaklarımıza GitHub
da eklemiş oluyoruz. Eğer hangi NuGet
kaynaklarını kullanıyorum? diye soracak olursanız dotnet nuget list source
komutunu kullanabilirsiniz.
Kaynak tanımlamamızı yaptığımıza göre artık console
uygulamamıza oluşturduğumuz paketi indirebiliriz. Bunun için projenin dizininde olduğumuzdan emin olup, dotnet add package simple_nuget
komutunu çalıştırıyoruz.
Paketimiz yüklendi. Şimdi paketimizin içerisindeki extension
lara erişebiliyor muyuz? buna bakalım. Bunun için main.cs
e geçelim.
Örnek olması açısından
dummy
json oluşturdum ve onu bizim oluşturduğumuz paket içerisinde var olanToDeserialize
methodunu çağırarakTest
classına çevirdim.
Her şey tamam gibi artık dotnet run
komutunu kullanarak projeyi çalıştırabiliriz. Böylece her şey düzgün mü? kontrol edelim.
Böylece yaptığımız tüm paketleme işleminin çalıştığını görmüş olduk. Artık bizimde yiyeceklerimiz kendi buzdolabımızda bozulmadan uzun süre kalabilecek.😊
Okuduğunuz için teşekkür ederim.
Sağlıcakla kalın…