#

WE ARE SHARING

OUR EXPERIANCE.

BELIEVE THE POWER OF SHARE

BLOG

Nuget Package ile kendi paketlerinizi oluşturmak ve yayınlamak

Nuget Package ile kendi paketlerinizi oluşturmak ve yayınlamak

Dünya, internetin hayatımıza girdiği günden beri küçülüyor. Bilgiye ulaşmak; sosyal medya, youtube, blogların türemesiyle birlikte hız kazandı. Bilginin aktarımı kolaylaştıkça yazılım sektörü için de kod paylaşımı kaçınılmaz bir hale geldi. Yazılımcılar Github’la, kaynak kod paylaşımında kapıları sonuna kadar açarak sektörün büyümesi için paylaşımın önemini ortaya koydu. Birçok işi sıfırdan kodlamak yerine hazır kod blokları, kütüphaneleri kullanmak hem zaman hem de efor kaybının önüne geçip, geliştiricinin tüm eforunu ürününü sonlandırmaya yönlendirmesine olanak sağlıyor.

Kod paylaşımının önem kazanmasıyla Microsoft’ta Visual Studio da kendi paylaşım platformunu ortaya çıkardı: NuGet. Doğrudan Visual Studio ya entegre edilen NuGet Package Manager nuget.org üzerinden yayınlanan 3. Kişi ve kurumların kod paketlerini geliştiricilerin hizmetine sundu. Hem de tamamen ücretsiz. Geliştiricilerin de paket paylaşımıyla, platform Visual Studionun vazgeçilmez bir parçası haline geldi. Öyle ki, Microsoft bile yeni oluşturduğunuz projelere dll eklemek yerine, indirilecek paket bilgisini verip dll ve dosyaların NuGet Package Manager tarafından indirilmesini sağlayan yeni bir yapıya geçti. Yani bir asp.net Mvc projesi açtığınızda MVC paketleri siz projeyi açtığınızda nuget.org üzerinden indirilip proje hazırlanıyor. 

Sadece Microsoft’un değil diğer geliştiricilerinde paketlerinin dağıtımı da biz geliştiriciler için vazgeçilmez duruma geldi. Örneğin işi Json’a düşüp de, Newtonsoft’un Json paketini kullanmayan yazılımcı yok gibidir. Ya da barkod oluşturmak / okumak için nuget package kullanmayan yazılımcı. Peki biz kendi oluşturduğumuz bir kodu nuget paketi haline getirip platformda yayınlayabilir miyiz?
Evet. NuGet platformunda, sadece tüketici değil, kod paylaşarak dağıtıcı olabiliriz. Hatta, kendi paketlerinizi nuget.org ile değil kendi sunucularınızdan yayınlayarak platform üzerinde yeni bir dağıtım ağı kurabilirsiniz. 


Paket oluşturmak nedir? Nasıl yapılır? 


Paketler aslında birleştirilmiş kod ve dosyalardır. Özel bir yöntemle birleştirilen paketler nuget.org veya sunucularınızda özel bir alana yüklenerek kullanıma hazır hale getiriliyor. 
Ön hazırlık olarak, paketinizi oluşturmadan önce paketinizin kaynak kodu (.cs, .vb dosyalarını) açık olarak mı paylaşacağınıza, yoksa .dll oluşturarak kütüphane olarak mı paylaşacağınıza, ayrıca sadece kod mu yoksa kaynak dosyasını (resim, .css, .js, .html, .cshtml, .vbhtml, .txt, diğer tüm dosyalar…) mı pakete ekleyeceğinize karar vermeniz gerekmekte. 
Paket dosya haritası 2 temel klasörden oluşmalı, content klasörü kaynak dosyalarınızı, lib klasörü dll dosyalarınızı barındırmalıdır. Eğer kodu dll halinde paylaşacak ve hiçbir kaynak dosyanız olmayacaksa content klasörü boş, lib klasörü ise kodunuzdan derlenmiş .dll uzantılı dosyayı içermelidir. Eğer kaynak kod veya kaynak dosyası paylaşacaksanız content klasörünü paketi yükleyen kullanıcının projesinin ana klasörü olarak düşünüp klasör ve dosyaları content klasörünün içine koyabilirsiniz. 

Paket Klasörü                     Paketi kullanan proje
Lib                                       bin 
Content                               Proje ana klasörü
Content/A                           Proje ana klasöründe A klasörü yaratılır
Content/A/image.png         paketteki image.png dosyası yaratılan A klasörünün içine kopyalanıp projeye eklenir. 
Content/Views                    Proje ana klasöründe View klasörü yoksa oluştur, varsa oluşturulmaz
Content/web.config           Proje ana klasörüne paketteki web.config dosyası kopyalanır. 


! Dikkat edin eğer geliştiricinin ana klasöründe web.config dosyası varsa (ki olması gerekir) paketi yükleyen geliştiriciye üzerine yazılsın mı diye soracak ve geliştirici onaylarsa web.config dosyası değiştirilecektir. Bu yüzden web.config, global.asax gibi dosyaların content içine koyulması geliştiricinin yazdığı kodları ezmeye veya sizin kodunuzun ezilmesine sebep olacaktır. Bu dosyaları paketinize koyarken dikkat etmenizde ve geliştiriciyi yönlendirmekte fayda olacaktır. 

Lib klasörünün içine .dll lerinizi .net versiyonlarına göre klasörleyerek oluşturabilirsiniz. 
Lib/net46/proje.dll
Lib/net452/proje.dll
Lib/net35/proje.dll
Lib klasörünü yukarıdaki gibi oluşturduğunuzda paketinizi kullanan proje versiyonu hangisi ise o versiyon içindeki proje.dll eklenecektir. Fakat bu işlem opsiyoneldir. 

Paketinizin içeriği bu iki klasörün oluşumuyla tamamlandı. Fakat kaynak dosya ve kod paylaşımında dosyanızı content klasörü içine kopyalamanız yeterli olmayabilir. Örneğin kaynak kodunuzun namespace i paket sahibi olarak size ait olacaktır. Ama paketin yükleneceği projenin namespacine dahil etmek isterseniz kodunuzu ve dosya uzantınızı değiştirmeniz gerekmekte. Kodunuzda, yüklenecek projenin namespace adını $rootnamespace$ anahtarıyla kullanabilirsiniz . Bu ifadenin geçtiği tüm içerik yükleme esnasında projenin namespace adıyla değiştirilecektir. Sadece kod değil, string ifade olarak da bu kodu kullanarak değişimi sağlayabilirsiniz. 


Aşağıdaki kod yükleme sonrasında değişerek projeye uygun bir duruma gelecektir.


namespace $rootnamespace$.Controllers {

    string namespaceName = “$rootnamespace$ Projesi”;

}


Yükleme sonrası, geliştiricinin göreceği kod aşağıdaki gibi olacaktır.

namespace Projem.Controllers {

    string namespaceName = “Projem Projesi”;

}


Proje kodlarının değiştirilebilmesi için kodun transform kelimeleriyle değiştirilmesi tek başına yeterli değildir. Ayrıca dosya uzantısının da değiştirilmesi gerekecektir. 

Transform kelimelerinin geçerli olduğu 2 dosya uzantısı vardır. 
.cs dosyalarında bu değişimi yaptırmak için uzantısını .cs.pp olarak değiştirmek gerekecektir.
.config dosyalarında bu değişimi yaptırmak için uzantısını .config.transform olarak değiştirmek gerekecektir. 
Sadece .pp ve .transform uzantılı dosyalarıdaki transform kelimeleri değiştirilecek ve yüklendikten sonra eski (.cs ve .config) uzantısına dönüştürülecektir.
Kullanabileceğiniz transform kelimeleri; $rootnamespace$, $FullPath$, $filename$

Bu değişikliği yapmanız gerekirse, paket oluşturmadan önce değişikleri content klasöründe tamamlamanız gerekmektedir. Paketleme için içerik dosyalarınız hazırlanmış olacaktır. 

Paketinizi hazırlamadaki son adım paket ismi, versiyonu gibi bilgileri içeren özellik dosyasını oluşturmak. Bunun için content ve lib klasörünün bulunduğu klasöre PaketAdı.nuspec dosyası oluşturmanız ve nuspec uzantılı dosyanın içeriğini aşağıdaki gibi tanımlamanız yeterli olacaktır.
Paketle ilgili Ad, Açıklama, yayıncı, geliştirici, versiyon, logo, lisans metinleri adresleri, güncelleme notları, arama etiketleri ve bu paketin kullanımının bağlı olduğu yüklenmesi gereken diğer paketleri tanımlamak gerekecektir. Bu ayarlar paketiniz için önemlidir. Paket işlevini düzgün açıklamak, doğru bir şekilde etiketlemek özellik bağlantılı paketleri doğru bir şekilde girmek paketinizin doğru dağıtımı için önemlidir. 

<?xml version="1.0"?>

<package>

    <metadata>

    <id>ProjeID (Benzersiz kimlik bilgisi)</id>

    <version>1.2 (Versiyonu değiştirecek aynı paketin kullanıcılar tarafından güncellenmesi sağlanabilecektir.)</version>

   <title>Paket Başlığı (Paketin listelerde görünecek başlığı) </title>

    <authors>Eren Berk Beriç (Kodu yazan kişi veya kurumlar, listelerde görüntülenir)</authors>

    <owners>Manta (Dağıtım hakkı sahibi)</owners>

    <licenseUrl>http://manta.com.tr/lisance.html (lisans metninin adresi)</licenseUrl>

    <projectUrl>http://manta.com.tr (projenin varsa web sitesi)</projectUrl>

    <iconUrl>http://manta.com.tr/logo_black.png (paketin ikonu, listelerde görüntülenen resim)</iconUrl>

    <requireLicenseAcceptance>false (lisans anlaşmasını kabul et butonu olacak mı yoksa lisans anlaşmasına gerek yok mu belirtilmeli)</requireLicenseAcceptance>

    <description>Proje Detayı (Projenizi anlatan kısa açıklama metni, listelerde görüntülenecek)</description>

    <releaseNotes>Güncelleme notları (eğer güncelleme yapıyorsanız, bu versiyonda gelecek değişiklikleri belirtebilirsiniz) </releaseNotes>

    <copyright>Copyright 2018</copyright>

    <tags>etiketler (her kelime etiket olarak sayılacaktır) </tags>

    </metadata>

</package>



Artık bir paket oluşturmak için gerekli tüm altyapıyı sağladınız. Paketi oluşturmak, bu adımlardan çok daha kolay ve kısa. Nuget.org dan indireceğiniz nuget.exe programını nuspec dosyanızla aynı konuma yerleştirin ve çalıştırın. (Console uygulaması olan nuget.exe yi cmd ile adresinden çağırabilirsiniz) 
ekrana 
>   nuget pack 
yazarak enter'a bastığınızda nuspec dosyasında belirtilen adla .nupkg dosyası oluşturulacaktır. Bu dosya sizin paketinizdir. (Not: Lib klasöründe versiyonlama yapmadığınız için gelen sarı uyarıları dikkate almanıza gerek yok.)

Paketi Yayınlama
Nupkg dosyasını ister nuget.org üzerinden isterseniz kendi sunucunuzdan yayımlayabilirsiniz. Nuget.org dan yayınlamak için nuget.org adresine girerek upload linkini kullanabilir Microsoft hesabınızla giriş yaparak nupkg dosyanızı yükleyebilirsiniz.
Eğer kendi sunucunuzu kuracaksanız. IIS üzerinde bir websitesi açarak içerisine nuget.server eklentisini kurabilirsiniz. Package adındaki klasörün içine nupkg dosyalarınızı kopyalayarak yayınlamaya başlayabilirsiniz. Versiyon değişimlerinde oluşan nupkg’ların adları farklı olduğundan eski versiyonları da klasörde saklayabilirsiniz. Versiyonları saklamanız, eski versiyonu kullanan kullanıcılar için daha iyi olacaktır.