{"id":1072,"date":"2017-02-19T23:47:52","date_gmt":"2017-02-19T21:47:52","guid":{"rendered":"https:\/\/gokhan-gokalp.com\/?p=1072"},"modified":"2018-05-18T22:36:24","modified_gmt":"2018-05-18T19:36:24","slug":"appveyor-ile-net-nuget-paketi-olusturarak-publish-etmek","status":"publish","type":"post","link":"https:\/\/gokhan-gokalp.com\/tr\/appveyor-ile-net-nuget-paketi-olusturarak-publish-etmek\/","title":{"rendered":"AppVeyor ile .NET NuGet Paketi Olu\u015fturarak Publish Etmek"},"content":{"rendered":"<p>Merhaba arkada\u015flar.<\/p>\n<p>Bu makale konumda biraz farkl\u0131 bir alana de\u011finerek, sizlere son zamanlarda severek kulland\u0131\u011f\u0131m bir <strong>CI<\/strong>(Continuous Integration) tool&#8217;u olan <strong>AppVeyor<\/strong>&#8216;un\u00a0<strong>Continuous Deployment<\/strong> fonksiyonunu kullanarak, .NET ile geli\u015ftirdi\u011fimiz library&#8217;leri\u00a0nas\u0131l NuGet paketi haline getirip kolay bir \u015fekilde\u00a0publish edebiliriz konusuna de\u011finmeye \u00e7al\u0131\u015faca\u011f\u0131m.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2017\/02\/appveyor-logo.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-1100 lazyload\" data-src=\"\/wp-content\/uploads\/2017\/02\/appveyor-logo.jpg\" alt=\"\" width=\"644\" height=\"141\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/02\/appveyor-logo.jpg 644w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/02\/appveyor-logo-300x66.jpg 300w\" data-sizes=\"(max-width: 644px) 100vw, 644px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 644px; --smush-placeholder-aspect-ratio: 644\/141;\" \/><\/a><\/p>\n<p>Daha \u00f6nce AppVeyor&#8217;u kullanmam\u0131\u015f arkada\u015flar i\u00e7in konuya ba\u015flamadan \u00f6nce belirtmek istiyorum ki, AppVeyor kullan\u0131m\u0131 open-source projeler i\u00e7in \u00fccretsizdir. Bu makale kapsam\u0131nda AppVeyor nedir, ne de\u011fildir gibi detaylara de\u011finmeyece\u011fimden dolay\u0131, merak eden arkada\u015flar <em><a href=\"https:\/\/www.appveyor.com\/\">buradan<\/a><\/em> inceleyebilirler.<\/p>\n<p>Bir \u00e7o\u011fumuz gerek i\u015f yerlerimizde, gerekse de open source projelerimizde NuGet server \u00fczerinden paketlerimizi bir \u015fekilde y\u00f6netiyoruz. CI\/CD d\u00fcnyas\u0131n\u0131n h\u0131zla geli\u015fmesi ile birlikte, deployment\u00a0i\u015flemlerinin <strong>automated<\/strong> bir hale getirilmesi sizlerinde bildi\u011fi gibi bir \u00e7ok a\u00e7\u0131dan bizlere\u00a0h\u0131z ve zaman kazand\u0131rmaktad\u0131r.<\/p>\n<p>En basitinden \u015fimdi ele alacak oldu\u011fumuz NuGet konusuna bakt\u0131\u011f\u0131m\u0131zda, e\u011fer herhangi bir CI arac\u0131 kullanm\u0131yor isek en basit haliyle:<\/p>\n<ul>\n<li>Projeyi build et<\/li>\n<li>Varsa test case&#8217;lerini \u00e7al\u0131\u015ft\u0131r<\/li>\n<li>NuGet Package Explorer&#8217;\u0131 kullanarak bir NuGet paketi olu\u015ftur<\/li>\n<li>Paketleme sonucunda elde edilen\u00a0&#8220;*.nupkg&#8221; dosyas\u0131n\u0131 local NuGet \u00fczerine veya nuget.org&#8217;a girerek, upload et.<\/li>\n<\/ul>\n<p>gibi manuel s\u00fcre\u00e7ler\u00a0ger\u00e7ekle\u015ftiriyoruz.<\/p>\n<p>AppVeyor ise bu ad\u0131mlar\u0131 bizim i\u00e7in automated bir hale getiriyor. Projeyi commit ettikten sonra ger\u00e7ekle\u015fen ad\u0131mlar ise:<\/p>\n<ul>\n<li>NuGet paketlerini restore ediyor<\/li>\n<li>Projeyi istedi\u011finiz modda build ediyor<\/li>\n<li>Varsa test\u00a0case&#8217;lerini \u00e7al\u0131\u015ft\u0131r\u0131yor<\/li>\n<li>Ba\u015far\u0131l\u0131 bir \u015fekilde ad\u0131mlar ger\u00e7ekle\u015fiyor ise, tan\u0131mlam\u0131\u015f oldu\u011fumuz NuGet spec&#8217;lerine g\u00f6re bir &#8220;*.nupkg&#8221; artifact&#8217;i olu\u015fturuyor<\/li>\n<li>Olu\u015fan artifact&#8217;i NuGet \u00fczerine\u00a0publish ediyor<\/li>\n<\/ul>\n<p>ve bu s\u00fcre\u00e7lerin hepsi otomatik olarak i\u015fliyor. Ne kadar g\u00fczel de\u011fil mi? :)<\/p>\n<p>\u0130\u015fin asl\u0131na bakt\u0131\u011f\u0131m\u0131zda her ne kadar \u00e7ok da fazla DevOps konular\u0131 ile i\u00e7li d\u0131\u015fl\u0131 olmasam da,\u00a0hayatlar\u0131m\u0131z\u0131 ne kadar da kolayla\u015ft\u0131rd\u0131klar\u0131 bir ger\u00e7ek!<\/p>\n<p>Dilerseniz \u015fimdi\u00a0\u00f6rne\u011fimize ge\u00e7elim. Bunun i\u00e7in \u00f6ncelikle <strong>GitHub<\/strong> \u00fczerinde &#8220;ci-nuget-sample&#8221; isminde public bir repository olu\u015fturuyorum. Olu\u015fturmu\u015f\u00a0oldu\u011fumuz repository&#8217;i, a\u015fa\u011f\u0131daki gibi Visual Studio \u00fczerinden <strong>clone<\/strong> edelim.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2017\/02\/ci-clone.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-1077 lazyload\" data-src=\"\/wp-content\/uploads\/2017\/02\/ci-clone.jpg\" alt=\"\" width=\"506\" height=\"147\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/02\/ci-clone.jpg 506w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/02\/ci-clone-300x87.jpg 300w\" data-sizes=\"(max-width: 506px) 100vw, 506px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 506px; --smush-placeholder-aspect-ratio: 506\/147;\" \/><\/a><\/p>\n<p>Clone i\u015flemini tamamlad\u0131ktan sonra i\u00e7erisine &#8220;HelloService&#8221; isminde yeni bir class library olu\u015ftural\u0131m ve ard\u0131ndan i\u00e7erisine &#8220;HelloService&#8221; isminde bir class tan\u0131mlayal\u0131m. Bu class&#8217;\u0131n g\u00f6revi,\u00a0\u00e7a\u011f\u0131r\u0131ld\u0131\u011f\u0131nda &#8220;Hello!&#8221; demek olsun. :)<\/p>\n<p>&#8220;HelloService&#8221; class&#8217;\u0131n\u0131 a\u015fa\u011f\u0131daki gibi kodlayal\u0131m.<\/p>\n<pre class=\"lang:c# decode:true\">namespace HelloService\r\n{\r\n    public class HelloService\r\n    {\r\n        public string SayHello()\r\n        {\r\n            return \"Hello!\";\r\n        }\r\n    }\r\n}<\/pre>\n<p>\u015eimdi istiyoruz ki biz bu &#8220;HelloService&#8221; i, NuGet \u00fczerinden bir paket olarak sunal\u0131m.<\/p>\n<h4>NuGet\u00a0Specification Olu\u015fturma<\/h4>\n<p>\u00d6ncelikle\u00a0bir NuGet paketi olu\u015fturabilmemiz i\u00e7in NuGet spec file&#8217;\u0131n\u0131 tan\u0131mlamam\u0131z gerekmektedir. Bunun i\u00e7in &#8220;HelloService&#8221; library&#8217;si \u00fczerine sa\u011f t\u0131klay\u0131p &#8220;Add &gt; New Item&#8221; penceresine geldikten sonra, &#8220;HelloService.nuspec&#8221; ad\u0131nda bir file olu\u015ftural\u0131m.<\/p>\n<p>Olu\u015fturmu\u015f oldu\u011fumuz nuspec file&#8217;\u0131n\u0131 ise a\u015fa\u011f\u0131daki gibi\u00a0tan\u0131mlayaca\u011f\u0131z. Ben tan\u0131mlama s\u0131ras\u0131nda en yayg\u0131n kullan\u0131lan metadata element&#8217;lerini kullanmaya \u00e7al\u0131\u015faca\u011f\u0131m.\u00a0Tan\u0131mlama s\u0131ras\u0131nda sizlerde <em><a href=\"https:\/\/docs.microsoft.com\/en-us\/nuget\/schema\/nuspec\">buray\u0131<\/a><\/em> referans alabilirsiniz.<\/p>\n<pre class=\"lang:default decode:true\"><!--?xml version=\"1.0\"?-->\r\n\r\n  \r\n    HelloService\r\n    $version$\r\n    HelloService\r\n    G\u00f6khan G\u00f6kalp\r\n    G\u00f6khan G\u00f6kalp\r\n    https:\/\/github.com\/GokGokalp\/ci-nuget-sample\r\n    false\r\n    Say hello!\r\n    Copyright 2017 G\u00f6khan G\u00f6kalp\r\n    Hello Service\r\n  \r\n    \r\n    \r\n  \r\n<\/pre>\n<p>Burada bulunan &#8220;id&#8221;, &#8220;version&#8221;, &#8220;description&#8221; ve &#8220;authors&#8221; alanlar\u0131 doldurulmas\u0131 gereken must alanlard\u0131r. Bunlar\u0131n d\u0131\u015f\u0131nda kalanlar ise opsiyonel olarak eklenebilmektedir. Burada dikkat ederseniz &#8220;version&#8221; k\u0131sm\u0131na value olarak &#8220;$version$&#8221; parametresini ekledim.\u00a0Versiyonlama i\u015flemini ilgili paketim i\u00e7in manuel olarak y\u00f6netmek yerine, AppVeyor&#8217;un\u00a0bu i\u015flemi otomatik olarak ger\u00e7ekle\u015ftirebilmesini sa\u011flam\u0131\u015f oluyoruz. (Bu i\u015flemin AppVeyor \u00fczerinden nas\u0131l handle edildi\u011fini ilerleyen k\u0131s\u0131mda g\u00f6rece\u011fiz)<\/p>\n<p>Spec \u00fczerindeki &#8220;metadata&#8221; d\u0131\u015f\u0131nda &#8220;files&#8221; k\u0131sm\u0131na bakt\u0131\u011f\u0131m\u0131zda ise, olu\u015fturulacak olan NuGet paketinin i\u00e7erisinde hangi assembly&#8217;lerin\u00a0olaca\u011f\u0131n\u0131, nelerin\u00a0exclude edilece\u011fini\u00a0tan\u0131mlayabiliyoruz.<\/p>\n<p>Bunlara ek olarak da e\u011fer paketimiz herhangi bir dependency&#8217;e ihtiyac\u0131 var ise, yine a\u015fa\u011f\u0131daki gibi tan\u0131mlayabilmek m\u00fcmk\u00fcnd\u00fcr:<\/p>\n<pre class=\"lang:default decode:true\">  \r\n    \r\n  \r\n<\/pre>\n<p>NuGet\u00a0specification file&#8217;\u0131 art\u0131k haz\u0131r durumdad\u0131r.<\/p>\n<h4>AppVeyor ile GitHub Entegrasyonu<\/h4>\n<p>Bu k\u0131s\u0131mda ise GitHub \u00fczerinde olu\u015fturmu\u015f oldu\u011fumuz &#8220;ci-nuget-sample&#8221; repository&#8217;sini, AppVeyor ile entegre \u00e7al\u0131\u015f\u0131r hale getirece\u011fiz. Yani repository \u00fczerine herhangi bir commit geldi\u011finde, otomatik olarak AppVeyor&#8217;un tetiklenmesini sa\u011flayaca\u011f\u0131z.<\/p>\n<p>Bunun \u00f6ncesinde, \u00f6ncelikle <em><a href=\"https:\/\/ci.appveyor.com\/signup\">buraya<\/a><\/em> t\u0131klayarak bir AppVeyor hesab\u0131 olu\u015ftural\u0131m. Hesab\u0131 olu\u015ftururken &#8220;Plan&#8221; sekmesinden &#8220;FREE &#8211; for open-source projects&#8221; se\u00e7ene\u011fini se\u00e7ebilirsiniz veya GitHub hesab\u0131n\u0131z var ise GitHub se\u00e7ene\u011fini t\u0131klayarak da GitHub hesab\u0131n\u0131z ile giri\u015f yapabilirsiniz. AppVeyor&#8217;a giri\u015f yapt\u0131ktan sonra &#8220;Projects&#8221; sekmesinden &#8220;New Project&#8221; e t\u0131klayarak, ben GitHub hesab\u0131m ile oturum a\u00e7t\u0131\u011f\u0131m i\u00e7in otomatik olarak GitHub repository&#8217;lerimi a\u015fa\u011f\u0131daki gibi getirdi.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2017\/02\/appveyor-new-project.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-1079 lazyload\" data-src=\"\/wp-content\/uploads\/2017\/02\/appveyor-new-project.jpg\" alt=\"\" width=\"977\" height=\"447\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/02\/appveyor-new-project.jpg 977w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/02\/appveyor-new-project-300x137.jpg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/02\/appveyor-new-project-768x351.jpg 768w\" data-sizes=\"(max-width: 977px) 100vw, 977px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 977px; --smush-placeholder-aspect-ratio: 977\/447;\" \/><\/a><\/p>\n<p>Bu ekran \u00fczerinden \u00f6rne\u011fimiz i\u00e7in olu\u015fturmu\u015f oldu\u011fumuz &#8220;ci-nuget-sample&#8221; projesinin, sa\u011f taraf\u0131nda bulunan &#8220;ADD&#8221; se\u00e7ene\u011fine basal\u0131m.<\/p>\n<p>Ekleme i\u015flemi ba\u015far\u0131l\u0131 bir \u015fekilde ger\u00e7ekle\u015ftikten sonra, a\u015fa\u011f\u0131daki gibi bir ekran\u0131 kar\u015f\u0131m\u0131za getirecektir.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2017\/02\/ci-sample-.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-1081 lazyload\" data-src=\"\/wp-content\/uploads\/2017\/02\/ci-sample-.jpg\" alt=\"\" width=\"750\" height=\"213\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/02\/ci-sample-.jpg 750w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/02\/ci-sample--300x85.jpg 300w\" data-sizes=\"(max-width: 750px) 100vw, 750px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 750px; --smush-placeholder-aspect-ratio: 750\/213;\" \/><\/a><\/p>\n<p>Ger\u00e7ekle\u015ftirdi\u011fimiz bu i\u015flem ile AppVeyor, GitHub \u00fczerindeki &#8220;ci-nuget-sample&#8221; projemizin webhook k\u0131sm\u0131na kendisini default olarak\u00a0eklemektedir. Emin olmak\u00a0i\u00e7in ise GitHub \u00fczerindeki repository&#8217;nin &#8220;Settings&#8221; sekmesinden, &#8220;Webhooks&#8221; k\u0131sm\u0131na girelim.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2017\/02\/github-webhook.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-1082 lazyload\" data-src=\"\/wp-content\/uploads\/2017\/02\/github-webhook.jpg\" alt=\"\" width=\"991\" height=\"320\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/02\/github-webhook.jpg 991w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/02\/github-webhook-300x97.jpg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/02\/github-webhook-768x248.jpg 768w\" data-sizes=\"(max-width: 991px) 100vw, 991px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 991px; --smush-placeholder-aspect-ratio: 991\/320;\" \/><\/a><\/p>\n<p>Yukar\u0131da g\u00f6rd\u00fc\u011f\u00fcm\u00fcz gibi &#8220;https:\/\/ci.appveyor.com\/api\/github\/webhook&#8221; url&#8217;i ile kendisini eklemi\u015f bulunmaktad\u0131r.<\/p>\n<p>Trigger ayarlar\u0131n\u0131 de\u011fi\u015ftirebilmek i\u00e7in ise, &#8220;Edit&#8221; butonuna basal\u0131m.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2017\/02\/webhook-setting.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-1083 lazyload\" data-src=\"\/wp-content\/uploads\/2017\/02\/webhook-setting.jpg\" alt=\"\" width=\"991\" height=\"799\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/02\/webhook-setting.jpg 991w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/02\/webhook-setting-300x242.jpg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/02\/webhook-setting-768x619.jpg 768w\" data-sizes=\"(max-width: 991px) 100vw, 991px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 991px; --smush-placeholder-aspect-ratio: 991\/799;\" \/><\/a><\/p>\n<p>Yukar\u0131da bulunan\u00a0&#8220;Payload URL&#8221; k\u0131sm\u0131nda AppVeyor&#8217;un projeniz i\u00e7in vermi\u015f oldu\u011fu URL yer almaktad\u0131r. E\u011fer AppVeyor otomatik olarak webhook ayar\u0131n\u0131 yapmam\u0131\u015f olsayd\u0131, GitHub repository setting&#8217;i \u00fczerinden yine &#8220;WebHooks&#8221; sekmesinden &#8220;New WekHook&#8221; diyerek, &#8220;Payload URL&#8221; i girmemiz ve trigger ayar\u0131n\u0131 se\u00e7memiz yeterli olacakt\u0131. Biraz a\u015fa\u011f\u0131ya bakt\u0131\u011f\u0131m\u0131zda bulunan &#8220;Let me select individual events.&#8221; ayarlar\u0131ndan ise, hangi event&#8217;lar do\u011frultusunda\u00a0AppVeyor&#8217;un trigger olmas\u0131n\u0131 istedi\u011fimizi se\u00e7ebilmekteyiz. Burada AppVeyor taraf\u0131ndan default olarak &#8220;Pull request&#8221; ve &#8220;Push&#8221; event&#8217;leri se\u00e7ili olarak gelmektedir.<\/p>\n<p>&#8220;Pull request&#8221; event&#8217;\u0131n\u0131n g\u00fczel taraf\u0131 ise herhangi bir brach&#8217;e bir pull request geldi\u011finde, merge i\u015flemini ger\u00e7ekle\u015ftirmeden hemen \u00f6nce AppVeyor taraf\u0131ndan otomatik olarak build ediliyor ve merge i\u015flemini ger\u00e7ekle\u015ftirirseniz ne ile kar\u015f\u0131la\u015fabilece\u011finizi g\u00f6rebiliyorsunuz.<\/p>\n<p>Biz \u00f6rne\u011fimiz gere\u011fi sadece master branc&#8217;i \u00fczerinden ilerleyece\u011fiz. GitHub \u00fczerindeki ayarlar\u0131m\u0131z tamamland\u0131\u011f\u0131na g\u00f6re, hen\u00fcz kodumuzu commit etmeden birde AppVeyor \u00fczerindeki ayarlara bir g\u00f6z atal\u0131m. Bunun i\u00e7in AppVeyor \u00fczerindeki &#8220;SETTINGS&#8221; sekmesine gelelim.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2017\/02\/appveyor-setting-1.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-1084 lazyload\" data-src=\"\/wp-content\/uploads\/2017\/02\/appveyor-setting-1.jpg\" alt=\"\" width=\"693\" height=\"673\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/02\/appveyor-setting-1.jpg 693w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/02\/appveyor-setting-1-300x291.jpg 300w\" data-sizes=\"(max-width: 693px) 100vw, 693px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 693px; --smush-placeholder-aspect-ratio: 693\/673;\" \/><\/a><\/p>\n<p>\u0130lk olarak &#8220;Next build number&#8221; k\u0131sm\u0131ndan bir sonraki build&#8217;in hangi numaraya sahip olaca\u011f\u0131n\u0131 ayarlayabiliyorsunuz ve bu build number, versiyon numaras\u0131 olarak da kullan\u0131labilmekte. Hat\u0131rlarsan\u0131z NuGet spec tan\u0131mlarken version sekmesine &#8220;$version$&#8221; olarak bir parametre vermi\u015ftik. \u0130\u015fte bu parametreyi AppVeyor deployment a\u015famas\u0131nda, &#8220;Build version format&#8221; k\u0131sm\u0131nda belirtmi\u015f oldu\u011funuz format&#8217;a g\u00f6re bir versiyon numaras\u0131 set etmektedir. Bunun d\u0131\u015f\u0131nda di\u011fer bir \u00f6nemli k\u0131s\u0131m ise &#8220;Branches to build&#8221; k\u0131sm\u0131d\u0131r. Biz burada build i\u015flemi sonras\u0131 otomatik olarak NuGet paketi olu\u015fturup publish\u00a0edece\u011fimiz i\u00e7in, &#8220;All branches&#8221; se\u00e7ene\u011fi yerine &#8220;Only branches specified below&#8221; k\u0131sm\u0131n\u0131 se\u00e7erek buraya master branch&#8217;i belirtmek gerekiyor. \u015euanda \u00f6rne\u011fimiz gere\u011fi tek bir branch&#8217;e sahip oldu\u011fumuz i\u00e7in, pek bir \u00f6nemi bulunmamaktad\u0131r.<\/p>\n<p>A\u015fa\u011f\u0131 k\u0131s\u0131mdaki se\u00e7eneklere bakt\u0131\u011f\u0131m\u0131zda ise burada belki kullanabilece\u011finiz &#8220;Ignore appveyor.yml&#8221; se\u00e7ene\u011fi olabilir. AppVeyor \u00fczerinde build ve deployment tarz\u0131 i\u015flemlerinizi, &#8220;yml&#8221; format\u0131nda bir file haz\u0131rlayarak da ger\u00e7ekle\u015ftirebilirsiniz. E\u011fer bu tarz i\u015flemlerin\u00a0d\u0131\u015far\u0131dan eri\u015filmesini istemiyorsan\u0131z, ignore se\u00e7ene\u011fini se\u00e7erek sadece aray\u00fcz \u00fczerindeki ayarlar ile ger\u00e7ekle\u015febilmesini sa\u011flayabilirsiniz.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2017\/02\/appveyor-setting-2.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-1085 lazyload\" data-src=\"\/wp-content\/uploads\/2017\/02\/appveyor-setting-2.jpg\" alt=\"\" width=\"609\" height=\"740\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/02\/appveyor-setting-2.jpg 609w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/02\/appveyor-setting-2-247x300.jpg 247w\" data-sizes=\"(max-width: 609px) 100vw, 609px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 609px; --smush-placeholder-aspect-ratio: 609\/740;\" \/><\/a><\/p>\n<p>Bunlar\u0131n d\u0131\u015f\u0131nda di\u011fer script alanlar\u0131 ile ilgili \u015fuan i\u00e7in bir ihtiyac\u0131m\u0131z yok.<\/p>\n<p>\u015eimdi geldi art\u0131k build k\u0131s\u0131mlar\u0131n\u0131 ayarlamaya. Hemen sol sekmeden &#8220;Build&#8221; k\u0131sm\u0131na ge\u00e7elim.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2017\/02\/appveyor-build-1.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-1086 lazyload\" data-src=\"\/wp-content\/uploads\/2017\/02\/appveyor-build-1.jpg\" alt=\"\" width=\"864\" height=\"687\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/02\/appveyor-build-1.jpg 864w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/02\/appveyor-build-1-300x239.jpg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/02\/appveyor-build-1-768x611.jpg 768w\" data-sizes=\"(max-width: 864px) 100vw, 864px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 864px; --smush-placeholder-aspect-ratio: 864\/687;\" \/><\/a><\/p>\n<p>Burada \u00fcst se\u00e7eneklerden &#8220;MSBUILD&#8221; se\u00e7ili oldu\u011fundan emin olal\u0131m. Bunun ard\u0131ndan &#8220;Configuration&#8221; k\u0131sm\u0131ndan build i\u015flemi ger\u00e7ekle\u015firken &#8220;Debug&#8221; m\u0131 yoksa &#8220;Release&#8221; konfig\u00fcrasyonunun mu kullan\u0131laca\u011f\u0131n\u0131 belirtece\u011fiz. Yukar\u0131da g\u00f6rd\u00fc\u011f\u00fcm\u00fcz gibi buraya &#8220;Release&#8221; yazal\u0131m.<\/p>\n<p>Sayfan\u0131n\u00a0alt k\u0131s\u0131m\u0131ndaki ayarlara bakt\u0131\u011f\u0131m\u0131zda ise burada &#8220;Before build script&#8221; k\u0131sm\u0131n\u0131 &#8220;CMD&#8221; se\u00e7elim ve buraya a\u015fa\u011f\u0131daki gibi &#8220;nuget restore&#8221; command&#8217;\u0131n\u0131 yazal\u0131m. Bu command sayesinde proje build olurken, kulland\u0131\u011f\u0131m\u0131z herhangi bir NuGet paketleri varsa otomatik olarak restore olacakt\u0131r.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2017\/02\/appveyor-build-2-.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-1089 lazyload\" data-src=\"\/wp-content\/uploads\/2017\/02\/appveyor-build-2-.jpg\" alt=\"\" width=\"617\" height=\"327\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/02\/appveyor-build-2-.jpg 617w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/02\/appveyor-build-2--300x159.jpg 300w\" data-sizes=\"(max-width: 617px) 100vw, 617px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 617px; --smush-placeholder-aspect-ratio: 617\/327;\" \/><\/a><\/p>\n<p>&#8220;After build script&#8221; k\u0131sm\u0131nda ise, &#8220;PS&#8221; k\u0131sm\u0131n\u0131 se\u00e7elim ve buraya yukar\u0131da oldu\u011fu gibi a\u015fa\u011f\u0131daki PowerShell Script&#8217;ini yazal\u0131m.<\/p>\n<pre class=\"lang:ps decode:true\">nuget pack HelloService\\HelloService.nuspec -version $env:APPVEYOR_BUILD_VERSION\r\nGet-ChildItem .\\*.nupkg | % { Push-AppveyorArtifact $_.FullName -FileName $_.Name }<\/pre>\n<p>Bu script ile k\u0131saca nuspec file&#8217;\u0131n\u00a0path&#8217;ini belirterek, versiyon numaras\u0131n\u0131 environment \u00fczerinden &#8220;APPVEYOR_BUILD_VERSION&#8221; parametresi ile almas\u0131n\u0131 ve ard\u0131ndan bir &#8220;*.nupkg&#8221; file&#8217;\u0131 olu\u015fturup\u00a0onu\u00a0push etmesini s\u00f6yl\u00fcyoruz.<\/p>\n<p>\u015eimdi geriye sadece deployment ayarlar\u0131 kald\u0131. Sol men\u00fcden h\u0131zl\u0131ca &#8220;Deployment&#8221; sekmesine ge\u00e7elim ve a\u015fa\u011f\u0131daki gibi NuGet ayarlar\u0131n\u0131 yapmaya ba\u015flayal\u0131m.<\/p>\n<p>\u0130lk olarak a\u00e7\u0131lan ekran\u0131n providers b\u00f6l\u00fcm\u00fcnden, &#8220;Add deployment&#8221; a t\u0131klayarak NuGet provider&#8217;\u0131n\u0131 se\u00e7elim.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2017\/02\/appveyor-deployment.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-1090 lazyload\" data-src=\"\/wp-content\/uploads\/2017\/02\/appveyor-deployment.jpg\" alt=\"\" width=\"930\" height=\"618\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/02\/appveyor-deployment.jpg 930w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/02\/appveyor-deployment-300x199.jpg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/02\/appveyor-deployment-768x510.jpg 768w\" data-sizes=\"(max-width: 930px) 100vw, 930px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 930px; --smush-placeholder-aspect-ratio: 930\/618;\" \/><\/a><\/p>\n<p>Bu k\u0131s\u0131mda biz direkt olarak <em><a href=\"http:\/\/www.nuget.org\">nuget.org<\/a>\u00a0<\/em>\u00fczerine publish edece\u011fimiz i\u00e7in, bu k\u0131sm\u0131 bo\u015f b\u0131rak\u0131yoruz. Burada yapmam\u0131z gereken ilk \u015fey kendimize bir NuGet hesab\u0131 olu\u015fturup, &#8220;API key&#8221; bilgisini buraya girmektir. NuGet \u00fcyeli\u011fini ise <em><a href=\"https:\/\/www.nuget.org\/users\/account\/LogOn?returnUrl=%2F\">buradan<\/a><\/em> ger\u00e7ekle\u015ftirebilirsiniz. \u00dcyelik i\u015flemini tamamlad\u0131ktan sonra, &#8220;Accounts&#8221; sayfas\u0131 alt\u0131nda bulunan &#8220;Credentials&#8221; sekmesinden &#8220;API Keys&#8221; bilgisine ula\u015fabilirsiniz.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2017\/02\/nuget-api.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-1091 lazyload\" data-src=\"\/wp-content\/uploads\/2017\/02\/nuget-api.jpg\" alt=\"\" width=\"981\" height=\"621\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/02\/nuget-api.jpg 981w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/02\/nuget-api-300x190.jpg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/02\/nuget-api-768x486.jpg 768w\" data-sizes=\"(max-width: 981px) 100vw, 981px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 981px; --smush-placeholder-aspect-ratio: 981\/621;\" \/><\/a><\/p>\n<p>API key&#8217;ini ald\u0131ktan sonra AppVeyor \u00fczerindeki &#8220;API key&#8221; b\u00f6l\u00fcm\u00fcne girelim ve ard\u0131ndan, &#8220;Do not publish symbol packages&#8221; se\u00e7ene\u011fini se\u00e7elim. Daha sonra &#8220;Deploy from branch&#8221; se\u00e7ene\u011fini se\u00e7erek a\u00e7\u0131lan alana ilgili branch ad\u0131n\u0131 yazal\u0131m ve art\u0131k ayarlar\u0131 kaydedelim.<\/p>\n<p>Bu ad\u0131mlar\u0131n\u00a0ard\u0131ndan deployment k\u0131sm\u0131n\u0131n son hali ise a\u015fa\u011f\u0131daki gibi olacakt\u0131r.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2017\/02\/nuget-deploy-2.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-1092 lazyload\" data-src=\"\/wp-content\/uploads\/2017\/02\/nuget-deploy-2.jpg\" alt=\"\" width=\"927\" height=\"713\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/02\/nuget-deploy-2.jpg 927w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/02\/nuget-deploy-2-300x231.jpg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/02\/nuget-deploy-2-768x591.jpg 768w\" data-sizes=\"(max-width: 927px) 100vw, 927px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 927px; --smush-placeholder-aspect-ratio: 927\/713;\" \/><\/a><\/p>\n<p>GitHub&#8217;a commit i\u015flemi i\u00e7in Visual Studio&#8217;ya art\u0131k geri d\u00f6nebiliriz. E\u011fer herhangi eksik bir \u015fey yapmad\u0131 ise, HelloService&#8217;i commit etti\u011fimiz an NuGet \u00fczerinde bir paket haline gelecektir. :)<\/p>\n<p>Commit i\u015fleminin ard\u0131ndan AppVeyor \u00fczerinden &#8220;LATEST BUILD&#8221; sekmesine gelelim ve ilgili commit&#8217;in buraya gelip build i\u015flemi i\u00e7in queue&#8217;ya al\u0131nd\u0131\u011f\u0131n\u0131 g\u00f6rebiliriz.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2017\/02\/appveyor-queue.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-1094 lazyload\" data-src=\"\/wp-content\/uploads\/2017\/02\/appveyor-queue.jpg\" alt=\"\" width=\"988\" height=\"158\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/02\/appveyor-queue.jpg 988w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/02\/appveyor-queue-300x48.jpg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/02\/appveyor-queue-768x123.jpg 768w\" data-sizes=\"(max-width: 988px) 100vw, 988px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 988px; --smush-placeholder-aspect-ratio: 988\/158;\" \/><\/a><\/p>\n<p>Build i\u015flemi burada k\u0131sa bir s\u00fcre i\u00e7erisinde ba\u015flayacakt\u0131r ve ba\u015flad\u0131\u011f\u0131nda ise a\u015fa\u011f\u0131daki gibi bir ekranla kar\u015f\u0131la\u015faca\u011f\u0131z.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2017\/02\/appveyor-deploy.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-1095 lazyload\" data-src=\"\/wp-content\/uploads\/2017\/02\/appveyor-deploy.jpg\" alt=\"\" width=\"985\" height=\"574\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/02\/appveyor-deploy.jpg 985w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/02\/appveyor-deploy-300x175.jpg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/02\/appveyor-deploy-768x448.jpg 768w\" data-sizes=\"(max-width: 985px) 100vw, 985px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 985px; --smush-placeholder-aspect-ratio: 985\/574;\" \/><\/a><\/p>\n<p>Burada dikkat edersek AppVeyor&#8217;da ilk build numaram\u0131z &#8220;1&#8221; oldu\u011fu i\u00e7in, ayarlam\u0131\u015f oldu\u011fumuz version format&#8217;\u0131 do\u011frultusunda ilk versiyonu &#8220;1.0.1&#8221; olarak belirlemi\u015ftir. AppVeyor, GitHub \u00fczerinden belirtmi\u015f oldu\u011fumuz master branch&#8217;ini \u00e7ekerek, build i\u015flemi s\u0131ras\u0131nda &#8220;nuget restore&#8221; i\u015flemini de ger\u00e7ekle\u015ftirmi\u015ftir. Sonras\u0131nda ise tan\u0131mlam\u0131\u015f oldu\u011fumuz nuspec file&#8217;\u0131n\u0131 kullanarak, &#8220;HelloService.1.0.1.nupkg&#8221; paketini\u00a0olu\u015fturmu\u015ftur ve\u00a0NuGet&#8217;e publish i\u015flemini ba\u015far\u0131yla ger\u00e7ekle\u015ftirmi\u015ftir.<\/p>\n<p>\u015eimdi NuGet hesab\u0131m\u0131z \u00fczerinden &#8220;Manage My Packages&#8221; k\u0131sm\u0131na girerek, buradan HelloService paketini se\u00e7elim ve detaylar\u0131na bir bakal\u0131m.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2017\/02\/nuget-package.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-1096 lazyload\" data-src=\"\/wp-content\/uploads\/2017\/02\/nuget-package.jpg\" alt=\"\" width=\"988\" height=\"789\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/02\/nuget-package.jpg 988w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/02\/nuget-package-300x240.jpg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/02\/nuget-package-768x613.jpg 768w\" data-sizes=\"(max-width: 988px) 100vw, 988px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 988px; --smush-placeholder-aspect-ratio: 988\/789;\" \/><\/a><\/p>\n<p>Evet! Paketimiz &#8220;HelloService&#8221; ismi ile ve &#8220;1.0.1&#8221; versiyon numaras\u0131 ile ba\u015far\u0131l\u0131 bir \u015fekilde NuGet \u00fczerinde yerini alm\u0131\u015f bulunmaktad\u0131r.<\/p>\n<p>Her ne kadar farkl\u0131 bir alana de\u011finmi\u015f olsam da, eminim\u00a0sizlerinde bir \u00e7ok konuda i\u015fine yarayacakt\u0131r. Konuyu burada sonland\u0131rmadan \u00f6nce son bir \u015fey daha eklemek istiyorum. GitHub&#8217;da bulunan baz\u0131 projeler \u00fczerinde sizlerde g\u00f6rm\u00fc\u015fs\u00fcn\u00fczd\u00fcr &#8220;build passing&#8221; veya &#8220;nuget package 1.0.0&#8221; gibi versiyon numaralar\u0131n\u0131n\u00a0g\u00f6rsellerini. Kendi paketim \u00fczerinden \u00f6rnek vermek gerekirse:<\/p>\n<p><a href=\"\/wp-content\/uploads\/2017\/02\/metrobus-ci.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-1097 lazyload\" data-src=\"\/wp-content\/uploads\/2017\/02\/metrobus-ci.jpg\" alt=\"\" width=\"930\" height=\"440\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/02\/metrobus-ci.jpg 930w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/02\/metrobus-ci-300x142.jpg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/02\/metrobus-ci-768x363.jpg 768w\" data-sizes=\"(max-width: 930px) 100vw, 930px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 930px; --smush-placeholder-aspect-ratio: 930\/440;\" \/><\/a><\/p>\n<p>Burada AppVeyor logosu ile g\u00f6rd\u00fc\u011f\u00fcm\u00fcz &#8220;build passing&#8221; ve nuget package versiyonlar\u0131 gibi g\u00f6rselleri ekleyebilmek i\u00e7in, AppVeyor&#8217;da &#8220;Settings&#8221; sekmesinin alt\u0131nda bulunan &#8220;Badges&#8221; k\u0131sm\u0131na girelim.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2017\/02\/badges-mark.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-1098 lazyload\" data-src=\"\/wp-content\/uploads\/2017\/02\/badges-mark.jpg\" alt=\"\" width=\"865\" height=\"684\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/02\/badges-mark.jpg 865w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/02\/badges-mark-300x237.jpg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/02\/badges-mark-768x607.jpg 768w\" data-sizes=\"(max-width: 865px) 100vw, 865px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 865px; --smush-placeholder-aspect-ratio: 865\/684;\" \/><\/a><\/p>\n<p>Burada g\u00f6rebildi\u011finiz gibi kullanmak istedi\u011finiz g\u00f6rsel URL&#8217;lerini AppVeyor sizlere sunmaktad\u0131r. Readme i\u00e7erisinde kullanabilmek i\u00e7in ise, &#8220;Sample markdown code&#8221; ile ba\u015flayan k\u0131s\u0131mdaki\u00a0kodu kullanarak sizlerde readme&#8217;leriniz \u00fczerine ekleyebilirsiniz.<\/p>\n<p>Makale boyunca ger\u00e7ekle\u015ftirdi\u011fimiz \u00f6rnek uygulamaya ve &#8220;appveyor.yml&#8221; dosyas\u0131na a\u015fa\u011f\u0131daki link \u00fczerinden eri\u015febilirsiniz.<\/p>\n<p>Takipte kal\u0131n.<\/p>\n<p><em><a href=\"https:\/\/github.com\/GokGokalp\/ci-nuget-sample\">https:\/\/github.com\/GokGokalp\/ci-nuget-sample<\/a><\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Merhaba arkada\u015flar. Bu makale konumda biraz farkl\u0131 bir alana de\u011finerek, sizlere son zamanlarda severek kulland\u0131\u011f\u0131m bir CI(Continuous Integration) tool&#8217;u olan AppVeyor&#8216;un\u00a0Continuous Deployment fonksiyonunu kullanarak, .NET ile geli\u015ftirdi\u011fimiz library&#8217;leri\u00a0nas\u0131l NuGet paketi haline getirip kolay bir \u015fekilde\u00a0publish edebiliriz konusuna de\u011finmeye \u00e7al\u0131\u015faca\u011f\u0131m. Daha \u00f6nce AppVeyor&#8217;u kullanmam\u0131\u015f arkada\u015flar i\u00e7in&#8230;<\/p>\n<div class=\"more-link-wrapper\"><a class=\"more-link\" href=\"https:\/\/gokhan-gokalp.com\/tr\/appveyor-ile-net-nuget-paketi-olusturarak-publish-etmek\/\">Devam\u0131n\u0131 okuyun<span class=\"screen-reader-text\">AppVeyor ile .NET NuGet Paketi Olu\u015fturarak Publish Etmek<\/span><\/a><\/div>\n","protected":false},"author":1,"featured_media":1100,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[375],"tags":[376,380,382,379,378,377,381],"class_list":["post-1072","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ci-continuous-integration","tag-appveyor","tag-appveyor-ile-nuget-paketi-olusturma","tag-continuous-delivery","tag-continuous-deployment","tag-continuous-integration","tag-nuget","tag-nuget-paketi-olusturma","entry"],"translation":{"provider":"WPGlobus","version":"3.0.2","language":"tr","enabled_languages":["en","tr"],"languages":{"en":{"title":true,"content":true,"excerpt":false},"tr":{"title":false,"content":false,"excerpt":false}}},"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>AppVeyor ile .NET NuGet Paketi Olu\u015fturarak Publish Etmek - G\u00f6khan G\u00f6kalp<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/gokhan-gokalp.com\/appveyor-ile-net-nuget-paketi-olusturarak-publish-etmek\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"AppVeyor ile .NET NuGet Paketi Olu\u015fturarak Publish Etmek - G\u00f6khan G\u00f6kalp\" \/>\n<meta property=\"og:url\" content=\"https:\/\/gokhan-gokalp.com\/appveyor-ile-net-nuget-paketi-olusturarak-publish-etmek\/\" \/>\n<meta property=\"og:site_name\" content=\"G\u00f6khan G\u00f6kalp\" \/>\n<meta property=\"article:published_time\" content=\"2017-02-19T21:47:52+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2018-05-18T19:36:24+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/02\/appveyor-logo.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"644\" \/>\n\t<meta property=\"og:image:height\" content=\"141\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"G\u00f6khan G\u00f6kalp\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"G\u00f6khan G\u00f6kalp\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/appveyor-ile-net-nuget-paketi-olusturarak-publish-etmek\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/appveyor-ile-net-nuget-paketi-olusturarak-publish-etmek\\\/\"},\"author\":{\"name\":\"G\u00f6khan G\u00f6kalp\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#\\\/schema\\\/person\\\/7e2a7fa98babd22a5fdae563c4b8cdbe\"},\"headline\":\"AppVeyor ile .NET NuGet Paketi Olu\u015fturarak Publish Etmek\",\"datePublished\":\"2017-02-19T21:47:52+00:00\",\"dateModified\":\"2018-05-18T19:36:24+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/appveyor-ile-net-nuget-paketi-olusturarak-publish-etmek\\\/\"},\"wordCount\":2095,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#\\\/schema\\\/person\\\/7e2a7fa98babd22a5fdae563c4b8cdbe\"},\"image\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/appveyor-ile-net-nuget-paketi-olusturarak-publish-etmek\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/uploads\\\/2017\\\/02\\\/appveyor-logo.jpg\",\"keywords\":[\"AppVeyor\",\"AppVeyor ile Nuget paketi olu\u015fturma\",\"Continuous Delivery\",\"Continuous Deployment\",\"Continuous Integration\",\"NuGet\",\"NuGet paketi olu\u015fturma\"],\"articleSection\":[\"CI (Continuous Integration)\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/gokhan-gokalp.com\\\/appveyor-ile-net-nuget-paketi-olusturarak-publish-etmek\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/appveyor-ile-net-nuget-paketi-olusturarak-publish-etmek\\\/\",\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/appveyor-ile-net-nuget-paketi-olusturarak-publish-etmek\\\/\",\"name\":\"AppVeyor ile .NET NuGet Paketi Olu\u015fturarak Publish Etmek - G\u00f6khan G\u00f6kalp\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/appveyor-ile-net-nuget-paketi-olusturarak-publish-etmek\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/appveyor-ile-net-nuget-paketi-olusturarak-publish-etmek\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/uploads\\\/2017\\\/02\\\/appveyor-logo.jpg\",\"datePublished\":\"2017-02-19T21:47:52+00:00\",\"dateModified\":\"2018-05-18T19:36:24+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/appveyor-ile-net-nuget-paketi-olusturarak-publish-etmek\\\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/gokhan-gokalp.com\\\/appveyor-ile-net-nuget-paketi-olusturarak-publish-etmek\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/appveyor-ile-net-nuget-paketi-olusturarak-publish-etmek\\\/#primaryimage\",\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/uploads\\\/2017\\\/02\\\/appveyor-logo.jpg\",\"contentUrl\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/uploads\\\/2017\\\/02\\\/appveyor-logo.jpg\",\"width\":644,\"height\":141},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/appveyor-ile-net-nuget-paketi-olusturarak-publish-etmek\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/gokhan-gokalp.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"AppVeyor ile .NET NuGet Paketi Olu\u015fturarak Publish Etmek\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#website\",\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/\",\"name\":\"G\u00f6khan G\u00f6kalp\",\"description\":\"C# &amp; Python lover\",\"publisher\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#\\\/schema\\\/person\\\/7e2a7fa98babd22a5fdae563c4b8cdbe\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/gokhan-gokalp.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#\\\/schema\\\/person\\\/7e2a7fa98babd22a5fdae563c4b8cdbe\",\"name\":\"G\u00f6khan G\u00f6kalp\",\"pronouns\":\"he\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/litespeed\\\/avatar\\\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659\",\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/litespeed\\\/avatar\\\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659\",\"contentUrl\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/litespeed\\\/avatar\\\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659\",\"caption\":\"G\u00f6khan G\u00f6kalp\"},\"logo\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/litespeed\\\/avatar\\\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659\"},\"sameAs\":[\"https:\\\/\\\/gokhan-gokalp.com\"],\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/tr\\\/author\\\/gok-gokalp\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"AppVeyor ile .NET NuGet Paketi Olu\u015fturarak Publish Etmek - G\u00f6khan G\u00f6kalp","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/gokhan-gokalp.com\/appveyor-ile-net-nuget-paketi-olusturarak-publish-etmek\/","og_locale":"tr_TR","og_type":"article","og_title":"AppVeyor ile .NET NuGet Paketi Olu\u015fturarak Publish Etmek - G\u00f6khan G\u00f6kalp","og_url":"https:\/\/gokhan-gokalp.com\/appveyor-ile-net-nuget-paketi-olusturarak-publish-etmek\/","og_site_name":"G\u00f6khan G\u00f6kalp","article_published_time":"2017-02-19T21:47:52+00:00","article_modified_time":"2018-05-18T19:36:24+00:00","og_image":[{"width":644,"height":141,"url":"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/02\/appveyor-logo.jpg","type":"image\/jpeg"}],"author":"G\u00f6khan G\u00f6kalp","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"G\u00f6khan G\u00f6kalp","Tahmini okuma s\u00fcresi":"10 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/gokhan-gokalp.com\/appveyor-ile-net-nuget-paketi-olusturarak-publish-etmek\/#article","isPartOf":{"@id":"https:\/\/gokhan-gokalp.com\/appveyor-ile-net-nuget-paketi-olusturarak-publish-etmek\/"},"author":{"name":"G\u00f6khan G\u00f6kalp","@id":"https:\/\/gokhan-gokalp.com\/#\/schema\/person\/7e2a7fa98babd22a5fdae563c4b8cdbe"},"headline":"AppVeyor ile .NET NuGet Paketi Olu\u015fturarak Publish Etmek","datePublished":"2017-02-19T21:47:52+00:00","dateModified":"2018-05-18T19:36:24+00:00","mainEntityOfPage":{"@id":"https:\/\/gokhan-gokalp.com\/appveyor-ile-net-nuget-paketi-olusturarak-publish-etmek\/"},"wordCount":2095,"commentCount":0,"publisher":{"@id":"https:\/\/gokhan-gokalp.com\/#\/schema\/person\/7e2a7fa98babd22a5fdae563c4b8cdbe"},"image":{"@id":"https:\/\/gokhan-gokalp.com\/appveyor-ile-net-nuget-paketi-olusturarak-publish-etmek\/#primaryimage"},"thumbnailUrl":"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/02\/appveyor-logo.jpg","keywords":["AppVeyor","AppVeyor ile Nuget paketi olu\u015fturma","Continuous Delivery","Continuous Deployment","Continuous Integration","NuGet","NuGet paketi olu\u015fturma"],"articleSection":["CI (Continuous Integration)"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/gokhan-gokalp.com\/appveyor-ile-net-nuget-paketi-olusturarak-publish-etmek\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/gokhan-gokalp.com\/appveyor-ile-net-nuget-paketi-olusturarak-publish-etmek\/","url":"https:\/\/gokhan-gokalp.com\/appveyor-ile-net-nuget-paketi-olusturarak-publish-etmek\/","name":"AppVeyor ile .NET NuGet Paketi Olu\u015fturarak Publish Etmek - G\u00f6khan G\u00f6kalp","isPartOf":{"@id":"https:\/\/gokhan-gokalp.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/gokhan-gokalp.com\/appveyor-ile-net-nuget-paketi-olusturarak-publish-etmek\/#primaryimage"},"image":{"@id":"https:\/\/gokhan-gokalp.com\/appveyor-ile-net-nuget-paketi-olusturarak-publish-etmek\/#primaryimage"},"thumbnailUrl":"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/02\/appveyor-logo.jpg","datePublished":"2017-02-19T21:47:52+00:00","dateModified":"2018-05-18T19:36:24+00:00","breadcrumb":{"@id":"https:\/\/gokhan-gokalp.com\/appveyor-ile-net-nuget-paketi-olusturarak-publish-etmek\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/gokhan-gokalp.com\/appveyor-ile-net-nuget-paketi-olusturarak-publish-etmek\/"]}]},{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/gokhan-gokalp.com\/appveyor-ile-net-nuget-paketi-olusturarak-publish-etmek\/#primaryimage","url":"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/02\/appveyor-logo.jpg","contentUrl":"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/02\/appveyor-logo.jpg","width":644,"height":141},{"@type":"BreadcrumbList","@id":"https:\/\/gokhan-gokalp.com\/appveyor-ile-net-nuget-paketi-olusturarak-publish-etmek\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/gokhan-gokalp.com\/"},{"@type":"ListItem","position":2,"name":"AppVeyor ile .NET NuGet Paketi Olu\u015fturarak Publish Etmek"}]},{"@type":"WebSite","@id":"https:\/\/gokhan-gokalp.com\/#website","url":"https:\/\/gokhan-gokalp.com\/","name":"G\u00f6khan G\u00f6kalp","description":"C# &amp; Python lover","publisher":{"@id":"https:\/\/gokhan-gokalp.com\/#\/schema\/person\/7e2a7fa98babd22a5fdae563c4b8cdbe"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/gokhan-gokalp.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/gokhan-gokalp.com\/#\/schema\/person\/7e2a7fa98babd22a5fdae563c4b8cdbe","name":"G\u00f6khan G\u00f6kalp","pronouns":"he","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/gokhan-gokalp.com\/wp-content\/litespeed\/avatar\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659","url":"https:\/\/gokhan-gokalp.com\/wp-content\/litespeed\/avatar\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659","contentUrl":"https:\/\/gokhan-gokalp.com\/wp-content\/litespeed\/avatar\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659","caption":"G\u00f6khan G\u00f6kalp"},"logo":{"@id":"https:\/\/gokhan-gokalp.com\/wp-content\/litespeed\/avatar\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659"},"sameAs":["https:\/\/gokhan-gokalp.com"],"url":"https:\/\/gokhan-gokalp.com\/tr\/author\/gok-gokalp\/"}]}},"_links":{"self":[{"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/posts\/1072","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/comments?post=1072"}],"version-history":[{"count":8,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/posts\/1072\/revisions"}],"predecessor-version":[{"id":1104,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/posts\/1072\/revisions\/1104"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/media\/1100"}],"wp:attachment":[{"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/media?parent=1072"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/categories?post=1072"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/tags?post=1072"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}