Çoğumuz bazı projelerde yazdığımız kodların aynısına ihtiyaç duyabiliyoruz ve bu kodları taşıma yöntemimiz ilkel olabiliyor, kopyala yapıştır yani. Ancak tekrar tekrar kullanabileceğimiz kodları paket haline getirip bunları sonradan kullanabilmek üzere github üzerinde ücretsiz bir şekilde yayınlayabileceğinizi ve sonradan kullanabileceğinizi biliyor muydunuz? Hadi gelin bu gün birlikte dotnet paketi oluşturup bunu github üzerinde yayınlayalım.
Öncelikle projemizi oluşturmamız gerekiyor. Sadece kodları kullanacağımız ve herhangi bir şekilde kodları execute etmeyeceğimiz için tercihim classlibrary’den yana.
1 |
dotnet new classlib -n EY.StringExtensions |
Ben projemin adına EY.StringExtensions dedim siz istediğiniz ismi verebilirsiniz.
C# üzerinde sıkça kullanmak zorunda olduğumuz bir mesajın hash karşılığını alan extension class’ı yazacağım, bunun içerisinde md5 ve sha1 olarak 2 yaygın hashleme methodunu yapan bir extension class yazalım.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
using System.Security.Cryptography; using System.Text; namespace EY.StringExtensions; public static class StringExtensions { public static string ToMd5Hash(this string input) { using (var md5 = MD5.Create()) { byte[] inputBytes = Encoding.UTF8.GetBytes(input); byte[] hashBytes = md5.ComputeHash(inputBytes); StringBuilder sb = new StringBuilder(); for (int i = 0; i < hashBytes.Length; i++) { sb.Append(hashBytes[i].ToString("x2")); } return sb.ToString(); } } public static string ToSha1Hash(this string input) { using (var sha1 = SHA1.Create()) { byte[] inputBytes = Encoding.UTF8.GetBytes(input); byte[] hashBytes = sha1.ComputeHash(inputBytes); StringBuilder sb = new StringBuilder(); for (int i = 0; i < hashBytes.Length; i++) { sb.Append(hashBytes[i].ToString("x2")); } return sb.ToString(); } } } |
Gördüğünüz gibi sınıf içerisinde sadece iki fonksiyon var ToSha1Hash ve ToMd5Hash normalde c# içerisinde bu hash değerlerini gördüğünüz yöntemlerle elde etmekteyiz ancak bu paket sayesinde bir extension method olarak kullanabileceğiz.
Şimdi gelelim paketimizi özelleştirebileceğimiz kısımlara.
Projemizi oluşturduğumu .csproj dosyası içerisinde proje bilgilerimiz barınıyor burada oluşturacak olduğumuz extension class paketimiz için tanımlamaları yapmalıyız, örneğin hangi versiyon ? veya üretcisi kim ? gibi gibi bilgiler
1 2 3 4 5 6 7 |
<Authors>Proje Üreticileri</Authors> <Version>Versiyon->Sayı</Version> <Company>Şirket</Company> <Product>Ürün(Proje) adı</Product> <Description>Proje açıklaması</Description> <PackageTags>Eklentiyi nuget üzerinde nasıl aratacaklar, etiketler</PackageTags> <RepositoryUrl>Projenin repository url'i</RepositoryUrl> |
Burada vermiş olduğum etiketleri .csproj dosyamız içerisinde <PropertyGroup> içerisinde vermeliyiz, benim projemdeki son hali aşağıdaki şekilde
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>net8.0</TargetFramework> <ImplicitUsings>enable</ImplicitUsings> <Nullable>enable</Nullable> <Authors>Erdinç YAŞAN</Authors> <Version>1.0</Version> <Company>erdincyasan</Company> <Product>EY.StringExtensionsPackExample</Product> <Description>This Project contains hash methods as extensions for string.</Description> <PackageTags>EY.StringExtensionsPackExample</PackageTags> <RepositoryUrl>https://github.com/erdyasan/stringextensions-pack-example.git</RepositoryUrl> </PropertyGroup> </Project> |
Tamamdır şimdi geldi sıra projemizi paket haline getirmeye.
1 |
dotnet pack -c Release -o out |
yukarıdaki komut ile kodlarımızı paket haline getirmekteyiz
Not: Pack komutunda projenizin yolunu belirtmeden çalıştırmak istiyorsanız terminaldeki konumunuz projenizin .csproj konumuyla aynı olmalıdır, eğer değil ise.
MSBUILD : error MSB1003: Specify a project or solution file. The current working directory does not contain a project or solution file. Hatası alabilirsiniz böyle bir durumda projenin yolunu belirtmelisiniz
1 |
dotnet pack "EY.StringExtensions/EY.StringExtensions.csproj" -c Release -o out |
Yukarıdaki kodu çalıştırdığınız dizinde bir adet out isimli klasör oluşacak ve içerisinde ise sonu npkg adlı bir dosya oluşacaktır. Bu bizim oluşturduğumuz paket. Bu paketi github üzerinde yayınlayabilmek için. Öncelikle bir adet Personal Access Token’a ihtiyacımız var şu adres üzerinde PAT’ınızı oluşturabilirsiniz. https://github.com/settings/tokens
Önemli olan nokta ise paket’i oluşturabilmek için aşağıdaki izinleri vermeniz gerekmektedir.
NOT: PAT’ı ürettikten sonra 1 kere görüntüleyebilirsiniz, kopyaladığınızdan emin olduktan sonra devam edebilirsiniz.
sonrasında ise nuget listelermize kendi github’ımızı eklememiz gerekiyor.
Hepmizin bildiği gibi dotnet projelerimi EntityFrameworkCore veya Jwt gibi paketleri eklerken nuget package manager kullanıyoruz varsayılan olarak nuget package manager iki adet package source ile gelmektedir bunları görüntüleyebilmek için.
1 |
dotnet nuget list source |
komutunu çalıştırdıktan sonra package source’larınız gelmektedir. Siz paketi indirebilmek adına ve ilgili source’a paket ekeyebilmek adına github üzerindeki package source’unuzu buraya eklememiz gerekmektedir.
Aşağıdaki kodu olduğu gibi github’ın dökümanlarından almaktayım açılayacağım dökümanı incelemek isterseniz : https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-nuget-registry
1 |
dotnet nuget add source --username USERNAME --password ${{ secrets.GITHUB_TOKEN }} --store-password-in-clear-text --name github "https://nuget.pkg.github.com/NAMESPACE/index.json" |
buradaki dotnet nuget add source -> nuget kaynaklarına yeni bir kaynak ekleyeceğimizi belirtiyoruz,
–username -> bu ifadeden sonraki USERNAME alanına kendi github kullanıcı adımızı eklemeliyiz.
–password -> bu alandan sonraki $ ile başlayan ve süslü parantezler ile açılıp kapanan alanın tamamına oluşturduğumuz pat’ı eklemeliyiz yani oluşturulan pat 12345 ise şöyle bir şey olmalı –password 12345
–store-password-in-clear-text alanı ise bu pat dosyasını olduğu gibi kaydetmesi için
–name -> bu ifadeden sonra gelen kısım ise nuget listesinde listelenirken gösterilecek olan isim varsayılan olarak github eklenmiş istediğniz ismi verebilirsiniz mygithub mygithubsource gibi gibi.
son olarak tırnak işaretleri içerisinde verilen alan ise github’ın package source’ına denk geliyor buradaki namespace alanına -> kullanıcı adı organizasyon adı olabilir ben kendi kullanıcı hesabımda saklayacağım için benimki şöyle olmalı
1 |
"https://nuget.pkg.github.com/erdyasan/index.json" |
tamamdır ilgili alanları tamamladıktan sonra artık nuget source listenize eklenmiş olması gerekmekte yukarıda source’ları listelediğimiz komutu tekrar kullanarak eklenip eklenmediğini görebilirsiniz.
Nuget source’u ekledikten sonra paketimizi pushlamaya başlayalım.
1 |
dotnet nuget push "nupkg uzantılı dosyanın yolu/ eğer aynı dizindeyseniz sadece adı yeterli" --source github --api-key pat |
buradaki komutu da çalıştırdıktan sonra Düzenlemeyi unutmayın =) paketiniz paylaşılabilmiş olacak gelin şimdi indirme işlemine bakalım.
Gördüğünüz gibi nuget package manager içerisinde arattığımızda benim paketim yayınlanmış bir halde gözüküyor
Artık kendi kodlarınızı diğer projelere eklerken kopyala yapıştır yapmak gerine github nuget repository üzerinde paket halinde ekleyip oradan paket halinde çekebilirsiniz.
Eğer hata ile karşılaşırsanız yorumlarda buluşalım, iyi çalışmalar dilerim.