.Net Core’a Yeni Proje Tipi Eklemek: Worker Service (Extended)
.Net Core ile arka planda çalışan servisler geliştirmeyi daha önceki bir yazımda detaylı olarak anlatmıştım. .Net Core 3.0 ile bu tarz uygulamalar için yeni bir proje tipi eklenmiş: Worker Service.
Bu yazı içerisinde, yeni eklenen Worker Service proje şablonunu değiştirip kendi proje şablonumu oluşturacağım.
Worker Service proje tipinin detaylı incelemelerini yazının sonundaki kaynaklarda bulabilirsiniz. Yeni eklenen Worker Service projesinin içinde kullanılan BackgroundService’ler ile ilgili detaylı yazımı şurada bulabilirsiniz.
Yeni bir Worker Service oluşturmak için;
$ dotnet new worker -n Worker.App
Worker Service tipinde yeni bir proje oluşturduğunuzda, bir arka plan uygulaması için minimum gereksinimler karşılanıyor. Fakat çoğu zaman ek olarak bir çok kod eklememiz gerekiyor. ‘appsetting.json’ dosyasına size özel ayarlar, sık kullandığınız Nuget paketleri, ek class’lar vs.
Yeni proje oluştururken bu tarz tekrar eden işleri azaltmak adına kendim için yeni bir proje tipi oluşturup, daha sonra yaratacağım projeleri bu proje tipi ile oluşturacağım: Worker Service (Extended)
$ dotnet new workerextended -n Worker.Ext.App
Bu yazı içerisinde nasıl yeni bir .Net proje tipi oluşturduğuma değinip kullandığım kaynakları paylaşacağım. Yeni oluşturacağım proje tipini denemek için Nuget’ten yükleyebilirsiniz;
$ dotnet new — install Worker.Extended::1.0.1
Kaynak kodlarını incelemek veya kodlarından yükleyerek kullanmak için;
Yeni Bir Proje Şablonu Oluşturmak
Aşağı yukarı yaptığım adımlar;
- Şablona eklemek istediğim proje dosyalarını oluşturmak.
- Yeni proje şablonuna özel ayların yapılması. (template.json)
- Nuget paketinin ayarlanması ve yayınlanması.
İlk olarak proje şablonunda bulunmasını istediğimiz dosyaları oluşturmalıyız. Benim oluşturacağım şablon Worker Service’den türeyeceği için referans olarak bu proje dosyalarını alıyorum. Yeni bir Worker Service oluşturup dosyalarını alabilirim veya .Net’in kaynak kodlarından proje şablon dosyalarını da alabilirim. Ben .Net Core kaynak dosyalarını referans aldım;
Daha sonrasında, örnek olarak aldığım dosyalara eklemeler yaparak, yeni oluşturacağım projede olmasını istediğim değişiklikleri yapıyorum. Örneğin appsettings.json dosyasına eklemeler, Program.cs dosyasında değişiklikler, Worker.cs dosyasında ekstra exception handling ve loglama gibi. Özelleştirdiğim Worker Service proje dosyalarını şurada bulabilirsiniz;
https://github.com/farukterzioglu/extendedWorker/tree/master/Company.Application1
Daha sonrasında proje şablonu ile ilgili dosyalar için ‘.template.config’ klasörünü oluşturmalıyız. Bu klasör içine de proje şablonu bilgilerini girmek için ‘template.json’ dosyasını oluşturuyoruz. Bu klasörün içeriklerine ve ‘template.json’ dosyasının içeriğine örnek olarak şurayı inceleyebilirisiniz;
template.json dosyasının içeriği oldukça geniş, benim değinmek istediğim bir kaç değer şunlar;
“shortName” değeri, yeni proje oluştururken proje tipi olarak belirtilecek olan parametre, örneğin konsol uygulaması için ‘dotnet new console’ gibi.
“sourceName” değeri, kaynak kodlarda geçtiği heryerde proje ismi olarak verilen değer ile değiştirilecek. ‘dotnet new [PROJE_TİPİ] -n Yeni.Proje’ olarak komut verirsek, ‘Yeni.Proje’ değeri, oluşturduğunuz proje şablonunda ‘Company.Application1’ geçen heryerde değiştirilecek. Örneğin namespace’lerde (namespace Company.Application1{} gibi), proje dosyasının isminde (Company.Application1.csproj) veya herhangi bir string değer ile yorum satırlarında. Bunun için oluşturduğunuz şablonda proje dosyalarını güncellerken, proje ismi ile aynı olmasını istediğiniz her yere “sourceName” de belirtilen ifadeyi yazmalısınız.
Aşağıdaki linkte template.json dosyasının tüm değerinin detaylarını bulabilirsiniz;
Yeni ‘Project Item’ Oluşturmak
Sık sık ihtiyac duyduğum bir konu da, mevcut bir Worker Service projesine ek BackgroundService’ler eklemek. Bu BackgroundService’leri de basit halleri ile değil de kendime göre ayarladığım versiyonunu kullanmak için yeni bir “Project Item” tipi tanımlayacağım.
dotnet new workerextended-service -n NewWorker
Aynen yeni proje oluşturduğumuz gibi, mevcut projelere eklemek üzere yeni class, css, js vs. şablonları da oluşturabiliriz. Bu da hemen hemen aynı adımlara sahip, farklı olarak template.json dosyasında tag’ler altında ‘type’ değerini ‘project’ değil de ‘item’ olarak ayarlamalıyız.
Benim oluşturduğum “Worker Service (Extended) Class” class’ını şurada inceleyebilirsiniz;
Aynen proje şablonunda olduğu gibi burada yeni Item’a verilen ismin, kaynak kodda belli yerlerde değiştirilmesi istediğimiz değeri ‘template.json’ dosyasında ‘sourceName’ altında tanımlıyoruz.
“sourceName”: “Worker1”
Oluşturduğumuz şablonları yükleyip denemek için ‘dotnet new -i’ komutunu kullanacağız. Yeni oluşturduğumuz proje şablonunu yüklemek için;
dotnet new -i ./Company.Application1
Aynı şekilde yeni oluşturulan proje item şablonunu yüklemek için;
dotnet new -i ./extendedWorkerClass
Sonrasında ‘dotnet new’ komutunu çağırdığımızda yeni şablonlarımızın listelendiğini görebiliriz;
Yüklü paketleri kaldırmak için ‘dotnet new -u’ komutunu kullanabiliriz. Komutu çağırdığımızda paketleri kaldırmak için gerekli olan komutlar listenecek;
Kurulu paketi kaldırmak için;
dotnet new -u /Users/farukterzioglu/extendedWorker/Company.Application1
Nuget Paketi
Geliştirdiğimiz iki şablonu Nuget paketi olarak yayınlamak için aynı dizine bir .csproj dosyası oluşturmalıyız. Bu proje dosyası normal proje şablonlarından (konsol, API vs) farklı olarak ‘Template’ tipinde. Bu dosya içerisine Nuget paket bilgisinde olmasını istediğimiz değerleri yazıyoruz;
Bu dosya içerisinde de önemli olan kısım, ItemGroup altına Nuget paketinde olmasını istediğimiz projeleri listeliyoruz. Tüm değerlerin açıklamalarını şurada bulabilirsiniz;
https://docs.microsoft.com/tr-tr/nuget/reference/msbuild-targets#pack-target
Buraya yazılan değerler ile oluşturulmuş örnek Nuget paketi sayfası;
Nuget paketi olarak derlemek için;
dotnet pack
Oluşan paket ile yüklemek için;
dotnet new -i bin/Debug/Worker.Extended.1.0.1.nupkg
Oluşan .nupkg dosyasını kullanarak kendi hesabınız ile aşağıdaki sitede Nuget paketi olarak yükleyebilirisiniz;
https://www.nuget.org/packages/manage/upload
Benim yüklediğim Nuget paketi;
Worker Service proje tipi incelemeleri;
İngilizce;
https://www.hanselman.com/blog/dotnetNewWorkerWindowsServicesOrLinuxSystemdServicesInNETCore.aspx
https://levelup.gitconnected.com/net-core-worker-service-as-windows-service-or-linux-daemons-a9579a540b77
https://medium.com/@nickfane/introduction-to-worker-services-in-net-core-3-0-4bb3fc631225
Türkçe;
https://mennankose.com/net-core-ile-worker-service-olusturma/
Referans kaynaklar;
https://github.com/aspnet/AspNetCore/tree/master/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-CSharp
https://github.com/dotnet/templating/wiki/%22Runnable-Project%22-Templates
https://devblogs.microsoft.com/dotnet/how-to-create-your-own-templates-for-dotnet-new/
https://github.com/sayedihashimi/dotnet-new-samples
https://github.com/dotnet/dotnet-template-samples
https://docs.microsoft.com/en-us/dotnet/core/tutorials/cli-templates-create-item-template
https://docs.microsoft.com/en-us/dotnet/core/tutorials/cli-templates-create-project-template
https://docs.microsoft.com/en-us/dotnet/core/tutorials/cli-templates-create-template-pack
Yeni proje şablonu örnekleri;