Jak łatwo zacząć z .NET Core
Zawsze myślałem, że mój pierwszy artykuł będzie szczegółowym samouczkiem na temat serveless z wieloma serwisami, zdeployowanej za pomocą jednej linijki na AWS za pomocą GitLab CI. Albo nawet post wychwalający zalety gry Dungeons and Dragons. Byłem taki niewinny…
Kilka dni temu przypadkiem usłyszałem, że niektóre agencje rekrutacyjne i firmy zatrudniające programistów, z zasady odrzucają kandydatów lub firmy, które chcą pracować z .NET z następujących powodów:
To stary i zamknięty ekosystem, całkowicie przeciwstawny innym, bardziej ekscytującym platformom, które są o wiele bardziej zwinne i otwarte, takie jak Node.js lub Ruby on Rails.
Właściwie to trochę jak Java. Ale Java, nie wspierana przez "zły" Microsoft, jest nadal tolerowana przez wyżej wymienione agencje i firmy.
Osobiście rozwijam aplikacje webowe przy użyciu C# i .NET Core na MacBooku i wdrażam je za pomocą GitLab na AWS przy użyciu funkcji Lambda, EC2 z Linuxem i Dockera. Wrzuciłem nawet trochę kodu i testów na oficjalne open-sourcowe repozytorium GitHuba 5 lat temu.
Byłem zmieszany, słysząc takie opinie o .Net. Miałem déjà-vu, gdyż czułem się jak wtedy, gdy dyskutowałem o innej mojej pasji, czyli wspomnianej już grze D&D i usłyszałem, że gry fabularne są elitarne, mają złą reputację i są bardzo nieprzystępne...
Więc oto jestem, wspinając się na mojego najszlachetniejszego konia bojowego, wkładając moją błyszczącą zbroję i wyruszając na wyprawę - nie w celu obrony wdowy i sieroty, ale w celu zawalczenia o reputację platformy .NET Core. W celu przekonania, że możemy rozwijać oprogramowanie w C# i .NET Core tak łatwo i szybko jak w JavaScript i Node.js.
Czym jest platforma .NET Core?
Przytoczę oficjalną dokumentację platformy .NET Core:
- Środowisko uruchomieniowe .NET Core zapewnia system typów, ładowanie assembly, garbage collector, natywną interoperacyjność i inne podstawowe usługi. Biblioteki .NET Core zapewniają podstawowe typy danych, typy kompozycji aplikacji i podstawowe narzędzia.
- Środowisko uruchomieniowe ASP.NET oferuje framework do budowy nowoczesnych, opartych na chmurze aplikacji połączonych z Internetem, takich jak aplikacje webowe, backendy do IoT czy mobile.
- Narzędzia .NET Core CLI i kompilatory języka (Roslyn i F#) umożliwiają korzystanie z platformy .NET Core.
- Narzędzie dotnet służy do uruchamiania aplikacji .NET Core i narzędzi CLI. Wybiera i hostuje środowisko uruchomieniowe, zapewnia zasady ładowania assembly oraz uruchamia aplikacje i narzędzia.
Podsumowując:
- Środowisko uruchomieniowe umożliwia obsługę plików binarnych .NET Core.
- ASP.NET Core to framework i zestaw bibliotek, które są gotowe do użycia przy tworzeniu aplikacji webowych i API.
- .NET Core CLI jest jak CLI każdej innej platformy, ponieważ pozwala m.in. na tworzenie, budowanie, publikowanie, konfigurowanie i inicjowanie projektów oraz wiele innych akcji..
Kodujmy!
Dość pogawędek. Moim celem jest pokazanie, jak szybko i łatwo rozpocząć pracę z .NET Core przy tworzeniu aplikacji i stron internetowych, tak jak przy użyciu Node.js lub Ruby on Rails - zaczynajmy.
Instalacja na Linuxie jest dość prosta; wystarczy kliknąć ten link i wybrać dystrybucję. Musisz przejść przez trzy lub cztery polecenia, aby zainstalować niezbędne pakiety.
Na Ubuntu tak to wygląda w terminalu:
wget -q https://packages.microsoft.com/config/ubuntu/19.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb
sudo apt-get install apt-transport-https
sudo apt-get update
sudo apt-get install dotnet-sdk-2.2
Sprawdź ostatnią wersję SDK podczas instalacji (2.2 w chwili pisania tego tekstu).
Oczywiście musisz to zrobić tylko raz, a następnie proste polecenie potwierdzi, że wszystko działa jak należy:
dotnet --version
> 2.2.300
Instalacja w macOS lub Windowsie jest jeszcze prostsza: wystarczy pobrać ją z oficjalnej strony Microsoft i pozwolić kreatorowi instalacji wykonać to za Ciebie. To zajmie kilka minut.
Hello World!
Postępując zgodnie ze znanym standardem, stwórzmy aplikację konsolową, której jedynym celem jest wyświetlenie Hello World!
Dla niecierpliwych czytelników, oto repozytorium Git.
Najpierw utwórz nowy folder, a następnie zainicjuj w nim swój projekt:
mkdir hello-world
cd hello-world
dotnet new console
Będziesz mieć następujące pliki i foldery:
hello-world
├── bin
├── obj
├── hello-world.csproj
├── Program.cs
Możesz zignorować foldery bin i obj, które są dostępne tylko do kompilacji i debugowania. Tak naprawdę nigdy nie musisz już ich przeglądać. Ja ignoruję je zarówno w VSCode, jak i Git.
Plik .csproj zawiera informacje o środowisku uruchomieniowym, pakietach, wersjach i innych właściwościach konfiguracji projektu. Domyślnie jest naprawdę mały.
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp2.2</TargetFramework>
</PropertyGroup>
</Project>
I wreszcie nasz najważniejszy plik: Program.cs.
using System;
namespace HelloWorld
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
}
}
}
Tutaj znowu nic nie jest podchwytliwe. Masz domyślną przestrzeń nazw. Klasę, w której deklarujesz swój główny punkt wejścia za pomocą metody statycznej Main(). Klasę lub przestrzeń nazw można zmienić na dowolne i nie muszą one być publiczne, podobnie jak metoda Main. Tutaj klasa jest wewnętrzna, a metoda jest prywatna.
Jedynym warunkiem jest posiadanie przynajmniej tej statycznej metody Main. Nawet parametry są opcjonalne, ale istnieją, aby zapewnić dostęp do argumentów poprzez wykonanie wiersza poleceń.
Teraz uruchomimy aplikację:
dotnet run
> Hello World!
To takie proste. Aby uzyskać wersję aplikacji, którą można wdrożyć w dowolnym środowisku posiadającym środowisko uruchomieniowe .NET Core (tutaj wersja 2.2), po prostu opublikuj aplikację w następujący sposób:
dotnet publish -c Release -o dist
Wynikowy folder dist powinien wyglądać następująco:
dist
├── hello-world.deps.json
├── hello-world.dll
├── hello-world.pdb
├── hello-world.runtimeconfig.json
Plik hello-world.pdb można usunąć, ponieważ jest przydatny tylko do debugowania, a jest generowany domyślnie, nawet w trybie "release". Możesz wyłączyć to działanie, dodając ten fragment kodu do swojego hello-world.csproj
(pod <Project />).
<PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
<DebugType>None</DebugType>
<DebugSymbols>false</DebugSymbols>
</PropertyGroup>
Zatem hello-world.dll
to skompilowany kod, wykonywalny przy użyciu tego polecenia:
dotnet hello-world.dll
Pliki deps.json i runtimeconfig.json są gotowe do obsługi zależności odpowiednio od innych pakietów i do skonfigurowania środowiska uruchomieniowego.
Wreszcie, podczas publikowania aplikacji, można równie łatwo zbudować paczkę na konkretną platformę, korzystając z Runtime Identifier Catalog:
dotnet publish -c Release -r win-x64 -o dist/win-x64
dotnet publish -c Release -r osx-x64 -o dist/osx-x64
dotnet publish -c Release -r linux-x64 -o dist/linux-x64
Hello Web!
Ok, dość szybko wypisaliśmy wiersz w konsoli, ale co z tematami webowymi? Otóż, to również będzie łatwe do zrobienia!
Najpierw dodajmy pakiet dla ASP.NET Core:
dotnet add package Microsoft.AspNetCore
Ten pakiet pozwoli nam skonfigurować, zbudować i uruchomić prosty WebHost. Można to zrobić w jednej linii kodu, w metodzie Main(). Musisz także odwołać się do nowego pakietu, podobnie jak przy importowaniu pakietu npm w Node.js. Gotowy Program.cs powinien wyglądać następująco:
using System;
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
namespace HelloWorld
{
class Program
{
static void Main()
{
Console.WriteLine("Hello World!");
WebHost.CreateDefaultBuilder()
.Configure(app => app.Run(context => context.Response.WriteAsync("Hello World!")))
.Build()
.Run();
}
}
}
Możesz użyć tych samych poleceń, aby uruchomić i zbudować aplikację:
dotnet run
Teraz otwórz przeglądarkę, przejdź do http://localhost: 5000 i ciesz się wspaniałym Hello World!:
Mam nadzieję, że po przeczytaniu tego tekstu Twoja opinia na temat .NET Core nieco ewoluowała.
Oryginał tekstu w języku angielskim przeczytasz tutaj.