.NET Core emekleme aşamasını geçtiğimiz aylarda 1.0 RTM versiyonu ile tamamladı. Yürüyor ama sağa sola çarpıyor, şu sıralar biraz daha düzgün yürümeyi öğreniyor diyebiliriz. Açık kaynak olması ve farklı platformlarda, aynı şekilde çalışan bir framework amaçlanması, mevcut .NET Framework kadar olgun bir hale gelmesi için biraz daha bekleyeceğiz demek. Bu gelişme ve olgunlaşma süresince de .NET Core ile ilgili bir çok yeni kavram da geliştirme kütüphanemize girdi, girmeye de devam ediyor.
Şu sıralar .NET Core ile ve ASP.NET Core ile sıkça uğraşmaktayım. Dolayısıyla bir çok yeni şeyi öğreniyor, sindiriyor ve fark ediyorum. Projelerinizi .NET Core alt yapısına çevirmeye başladıysanız büyük bir ihtimal benzer şeyleri yaşıyoruz. Yeni şeyleri fark ederken yaşadığım bir “publish” problemdeninden dolayı .NET Core ile ilgili bir şeylerden bahsetmek istiyorum. Bildiğiniz gibi .NET Core’un, platform bağımsız ve taşınabilir olması amaçlanıyor. Platform bağımsız derken, hem geliştirme hem çalışma ortamlarının Windows, OS X ya da Unix sistemlerde olması, taşınabilir derken de, Windows’da çalışan uygulamanın, aynı dosyalar ile Unix’e taşınıp, orada da sorunsuz çalışabilmesini kastediyorum.
Bu noktada .NET Core uygulamalarının “taşınabilirlik” özelliğinden biraz bahsetmeye çalışacağım. Geliştirdiğiniz uygulamaların bir çok farklı platformda çalışabilmesi için yapacağınız publish ayarlarını ve konfigürasyonları anlamak için, .NET Core da “taşınabilirlik” ne demek biliyor olmamız lazım.
.NET Core’da bu çerçevede iki farklı uygulama tipi var. “Portable”(Taşınabilir) ve “Self-Contained”(Bağımsız) uygulamalar…
“Portable” uygulamalar
“Portable” uygulamalar, çalışacağı makine de .NET Core’un yüklü olmasını gereksinimine sahip uygulamalardır. Geliştirdiğiniz uygulama eğer bu tip bir uygulama ise, .NET Core yüklü herhangi bir sistemde çalışacaktır. Uygulamanızın çalışması için oluşturulan “publish” paketi içerisinde sadece sizin yazdığınız bileşenler ve varsa kullandığınız diğer yardımcı bileşenler, uygulamanızın çalışması için yeterli olacaktır. Bu uygulama tipi, .NET Core uygulamalarının varsayılan tipi. Bu tip uygulamalar geliştirmek için projecj.json dosyanızın içeriği temel olarak aşağıdaki gibi ve dependencies‘deki .NET Core’un “type:platform” özelliğini yeterli olacaktır.
{ "buildOptions": { "emitEntryPoint": true }, "dependencies": { "Microsoft.NETCore.App": { "version": "1.0.0", "type": "platform" } }, "frameworks": { "netcoreapp1.0": {} } }
Eğer projenizde destekleyici farklı bir bileşen kullanıyorsanız bunlarıda “dependencies” altına eklemeniz gerekecektir tabi ki. Bu uygulamanızı “publish” ettiğinizde; dotnet publish, publish klasöründe sadece ilgili *.dll’leri görürsünüz. Bu *.dll’leri .NET Core yüklü herhangi bir sisteme taşıdığınız takdirde uygulamanız sorunsuz çalışacaktır.
“Self-Contained” uygulamalar
Bu tip uygulamalar, adından da anlaşılabileceği gibi, bağımsız olup, çalışacağı sistemde .NET Core’un yüklü olmasını gerektirmez. Çünkü “publish” olduğunda tüm gerekli dosyaları içerisinde barındıracaktır. Bu “publish” içeriğinin daha büyük olmasına neden olacaktır tabi ki, ama Docker gibi container platformlarında uygulamanızı host etmek isterseniz tercih edilebilecek bir yaklaşım olabilir.
Bu tip uygulamaların project.json konfigürasyonu biraz daha farklı olacaktır. “Portable” tipdeki uygulamalardan farklı olarak “type:platform” özelliği dosyanın içerisinde olmamalı.
{ "buildOptions": { "emitEntryPoint": true }, "dependencies": { "Microsoft.NETCore.App": { "version": "1.0.0" } }, "frameworks": { "netcoreapp1.0": {} }, "runtimes": { "win10-x64": {}, "osx.10.11-x64": {} } }
Ek olarak “runtimes” özelliğinde uygulamanın çalışacağın platformlar belirtilmelidir. Bu tanımlamaya göre projemizi publish ettiğimizde ilgili platform için uygulamamızın çalışması için gerekli tüm bileşenler publish klasöründe olacaktır. Böylece çalışacağı sistemde .NET Core yüklü olmak gerekliliği ortadan kalkmış oluyor.
Farklı amaçlar için tercih edebileceğimiz bu uygulama tipleri, .NET Core uygulamalarının çalışması için önemli bir konu. Şimdilik bu kadar, bir sonraki yazıda görüşürüz.
!!!Önemli!!! .NET Core’un ilerleyen versiyonlarında project.json değişeceği için bu yazıdaki örnekler ilerleyen versiyonlarda farklılaşabilir.