GitHub’da Private NuGet Package Nasıl Oluşturulur?

Emre Balcı
5 min readSep 14, 2020

--

İ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 olan extension, helper , cacheservisi, log servisi gibi yardımcı classlar bulunmaktaydı. Zamanla ana projemizin yanına ufak projeciklerde yapmaya başladık. Orda da cache, 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ğin cache servisde master-slave yapısına geçmeye kalktığımızda tüm oluşturduğumuz projelerde değişiklik yapmamız gerekecekti. Çözüm olarak common 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.

Bu classta örnek olarak serialize edilmiş bir modelin deserialize edilmesi için bir method yaptık. Aynı şekilde string bir ifadeyi herhangi bir tipe çeviren method oluşturduk.

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 editleyip versiyonu 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.

/bin/Debug klasörünün altına NuGet paketimizi oluşturmuş olduk.

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ğumuz config dosyasını kullanmasını söylemiş oluyoruz. Peki neden “github” dedik?

Çünkü config dosyamıza bakacak olursanız packageSources node’nun altında “github” adında bir key eklemiştik. Yani komutta “github” diye belirttiğimiz, bizim bu eklediğimiz source 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.

nuget.org haricinide şu anda yeni eklemiş olduğum GitHub kaynağını görüyoruz.

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 olan ToDeserialize methodunu çağırarak Test 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…

--

--