Dotnetowiec na Linuxie

Życie jest pełne wyborów, ale czasem trzeba dodać “why not both?”. Uwielbiam .NET, jest prosty do opanowania, pozwala na szybkie tworzenie aplikacji i ma bogatą bibliotekę standardową. Jednocześnie lubię pracować na Linuxie, ponieważ mogę instalować aplikacje i biblioteki jednym poleceniem w terminalu, mam szeroki wybór powłok graficznych, jest często szybszy i zajmuje mniej miejsca na dysku niż Windows.

Czy jestem w stanie pogodzić .NET i Linux?  Tak!

Więc co tak właściwie jest dostępne pod Linuxem? Są obecnie dwa projekty: Mono oraz .NET Core. Czym jest pierwsze, a czym drugie?

Mono

Mono powstało wkrótce po .NET 1.0 i jest jego czystą implementacją. Co jest ważne to to, że Mono zawiera CLR, wszystkie biblioteki .NETowe, które są dostępne we Frameworku (oprócz specyficznych dla Windowsa) oraz narzędzia do kompilacji. Mono jest tworzone przez community i jest w pełni open-source’owe. Obecnie, po przejęciu przez Microsoft firmy Xamarin, jest przez Microsoft sponsorowane.

.NET Core

.NET Core jest młodszym bratem .NET Frameworka, gdzie Microsoft postanowił zmienić sposób w jaki rozwija swoją platformę. Core ma otwarte źródła, ale głównie rozwija go sam Microsoft. Tutaj również mamy nowy CLR, ale nie jest to pełny framework, a tylko “core”, czyli pewien podzbiór bibliotek dotnetowych - .NET Core był tworzony głównie z myślą o ASP.NET MVC, aby można było tworzyć aplikacje webowe i hostować je na serwerach z Linuxem.

Instalacja

Aby zainstalować Mono, otwórz konsolę jako root i użyj menadżera paczek dla twojej dystrybucji (apt-get, pacman, yum) aby pobrać paczkę mono-complete, która zawiera wszystko co z Mono związane. Dostępne są również mniejsze paczki, które nie zawierają narzędzi do kompilacji, a tylko niezbędny runtime.

Aby zainstalować .NET Core kieruj się instrukcjami z tej strony lub bądź sprytniejszy i użyj Dockera. Obraz który nas interesuje to microsoft/dotnet. Wpierw zapoznaj się z moim postem o Dockerze, gdzie opisałem jak zainstalować i uruchomić nowy kontener.

Zachęcam aby odpalać kontener .NET Core np. takim poleceniem:

docker run -it -v ~/dotnet:/home/dotnet microsoft/dotnet

Gdzie najpierw musimy utworzyć folder dotnet w katalogu domowym i będzie on dostępny w kontenerze pod /home/dotnet.

Nowy projekt

Ponieważ Mono jest jak .NET Framework, nie ma narzędzia tworzącego nowy projekt. Jeśli robimy coś małego (1-2 pliki) to możemy po prostu napisać nasz kod i skompilować go “ręcznie”. Jeśli robimy coś większego, to będzie nam się opłacało sięgnąć po np. MonoDevelop (o którym poniżej), który nam odpowiednie pliki projektu utworzy.

W .NET Core natomiast posłużymy się poleceniem dotnet new, które utworzy nam program Hello World w C# wraz plikiem project.json (w dotnet-preview <= 2*). A następnie poleceniem dotnet restore utworzymy plik project.lock.json, który ustali nasze dokładne zależności.

Kompilowanie

Mono posiada w swoim asortymencie program mcs, który jest odpowiednik csc.exe, czyli C# Compiler. Podajemy mu listę plików *.cs i kompilujemy “ręcznie”. Kiedy zaś pracujemy z projektem .csproj, lub całą solucją .sln to użyjemy narzędzia xbuild, które jest odpowiednikiem msbuild.exe.

W .NET Core skompilujemy nasz projekt poleceniem dotnet build w katalogu aplikacji.

Uruchamianie

W Mono mamy program mono, któremu w parametrze przekazujemy nasz plik .exe. Można też tak ustawić system aby uruchamiać pliki exe w mono bezpośrednio z powłoki (bez przedrostka mono).

W .NET Core uruchamiamy program poleceniem dotnet run w jego katalogu.

IDE

Mamy trzy główne IDE do pracy z dotnetem na Linuxie: MonoDevelop, Visual Studio Code i JetBrains Rider

MonoDevelop jest napisane w C# i oparte o bibliotekę GTK#, która korzysta z biblioteki GTK+. Jest to pierwszy odpowiednik Visual Studio na Linuxie. Zawiera template’y aplikacji, zarządzaniem plikami *proj, ma IntelliSense i kolorowanie składni. Pozwala też na debugowanie aplikacji.

Visual Studio Code jest oparte o NodeJS i Elektron i zostało napisane do tworzenia aplikacji ASP.NET z głównym wsparciem dla JavaSciptu. Jednakże spora kolekcja pluginów umożliwia również programowanie w C# i F#, wraz z IntelliSense, kolorowaniem składni i debugowaniem.

Projekt Rider, który jest jeszcze w fazie beta, jest oparty o platformę IntelliJ i będzie najpotężniejszym graczem wśród tych IDE, ponieważ zawiera w sobie silnik ReSharpera, który jest bardzo ceniony przez programistów C#.

Podsumowanie

Jak widać, da się pracować z dotnetem na Linuxie. Mimo to sporo osób nadal myśli, że .NET => Windows. Więc trzeba szerzyć “dobrą nowinę” ;)

I jeszcze słowem końca - do aplikacji okienkowych polecam Eto.Forms, która pozwala na uruchomienie raz napisanej aplikacji na kilku różnych platformach.

.NET All the things!!!