Jak nastavit verzi ASP.NET Core runtime na vývojářském a produkčním prostředí
Článek se vztahuje k verzi produktu ASP.NET Core 3.0
Tento článek byl napsán v roce 2019. Vývojářské technologie se neustále inovují a článek již nemusí popisovat aktuální stav technologie, ideální řešení a můj současný pohled na dané téma.
S příchodem nové verze .NET Core 3.0 se vývojářům začínají množit v počítači různé verze SDK, které mohou způsobit na první pohled nepochopitelné anomálie. Vývojáři se na mě obrací často s velmi podobnými dotazy, pro které jsem sepsal tento rychlý souhrn chování verzí SDK a runtimes ve verzi .NET Core 3.0.
SDK (dev prostředí)
SDK si instaluje vývojář typicky na vývojářský stroj. Jeho součástí jsou veškeré nástroje společně s potřebným runtime a frameworkem. Na jednom stroji může být nainstalováno více verzí SDK. Skrze různá IDE (např.: Visual Studio) nebo CLI lze následně s vybranou verzí SDK pracovat. Není-li explicitně nastaveno jinak, používáte vždy nejvyšší nainstalovanou verzi SDK. Pokud chcete v nějaké složce pracovat s jinou verzí SDK, musíte si vytvořit soubor global.json, například pomocí příkazu
dotnet new globaljson --sdk-version 3.0.100
Přepínačem --sdk-version si vybíráte verzi SDK, která se má použít. Výsledkem příkazu je vytvoření souboru global.json. Máte-li danou verzi SDK v PC, pak s ní můžete v dané složce pracovat.
Součástí SDK jsou i šablony projektů. Pokud si tedy vytvoříte novou prázdnou MVC aplikaci, její výchozí nastavení se bude pro různá SDK lišit.
Framework
Nastavení projektů se uchovává v souborech csproj. Jejich struktura vypadá zhruba následovně:
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>netcoreapp3.0</TargetFramework> </PropertyGroup>
První řádek s částí Microsoft.NET.Sdk definuje, že budeme používat pouze .NET Core, což nám umožní například vývoj konzolovek. Sekce TargetFramework definuje, že chceme použít verzi .NET Core 3.0.0 a vyšší. Takovéto nastavení nám neumožní vývoj webových aplikací (ledaže bychom si postahovali celý webový framework z NuGetu). Pojďme na další příklad:
<Project Sdk="Microsoft.NET.Sdk.Web"> <PropertyGroup> <TargetFramework>netcoreapp3.0</TargetFramework> </PropertyGroup>
V tomto příkladě se nastavení mírně liší. Hodnota Microsoft.NET.Sdk.Web definuje, že budeme používat webový framework (ASP.NET Core). Stejně jako v předchozím případě verze ASP.NET Core 3.0.0 a vyšší.
Výše uvedené příklady zároveň logicky naznačují "vrstvení frameworků". Součástí ASP.NET Core je samozřejmě i .NET Core.
Verze frameworku / runtime
Když aplikaci s takto definovaným csproj zkompilujete, vybere se v rámci daného stroje vhodná verze frameworku a ta je následně uvedena ve výsledku buildu v souboru aplikace.runtimeconfig.json. Za normálních okolností se pro výběr vhodné verze aplikuje roll-forwarding (o tom později). Výsledek buildu je v podstatě FDD aplikace, tedy aplikace, která je závislá na runtime (frameworku) nainstalovaném na daném stroji. Host se pro výběr verze runtime dívá právě do souboru aplikace.runtimeconfig.json a dle nastavení se rozhoduje, jakou verzi runtime použije.
Úplně stejné nastavení funguje mimochodem pro publikaci aplikace. V případě SCD publikace je rozdíl v tom, že vybraný runtime (framework) se rovnou přibalí do výsledku kompilace a v souboru aplikace.runtimeconfig.json už se verze neuvádí (je součástí balíku a tudíž i pevně daná).
Roll-Forward
Při volbě správné verze frameworku se používá roll-forward. Implicitní nastavení roll-forwardu je Minor. Toto nastavení říká, že se má použít nejvyšší dostupný patch na daném stroji. Pokud není k dispozici Minor verze, použije se nejbližší vyšší verze. Takže když mám na PC verze 2.1.0, 2.1.1, 2.2.0, 2.2.1 a vypublikuji .NET Core 2.0 aplikaci vyžadující třeba verzi 2.0.8, použije se 2.1.1. Pakliže vypublikuji aplikaci vyžadující verzi 2.2.0, použije se 2.2.1 (pouze se patchuje).
Roll-Forward může mít jedno z následujících nastavení: LatestPatch, Minor, Major, LatestMinor, LatestMajor a nebo Disable. Pokud zvolíte hodnotu Disable, pak se vyžaduje verze striktně definovaná. Ostatní nastavení jsou z názvu patrná.
Nakonec ještě podotýkám, že použitím stable verze se z roll-forwardu vylučují preview verze. Naopak vyžádáním jakékoliv preview verze se do roll-forwardu automaticky zahrnují všechny non-stable verze.
Nastavení roll-forward
Od verze .NET Core 3.0 se chování rollforward a patchování sjednocuje do dvou vlastností a lze je nastavit přímo v csproj:
<Project Sdk="Microsoft.NET.Sdk.Web"> <PropertyGroup> <TargetFramework>netcoreapp3.0</TargetFramework> <RollForward>LatestMinor</RollForward> <RuntimeFrameworkVersion>2.2.6</RuntimeFrameworkVersion> </PropertyGroup>
Výše uvedené nastavení se zpropaguje do zmíněného aplikace.runtimeconfig.json. Explicitní nastavení RuntimeFrameworkVersion říká, že minimální akceptovatelná verze frameworku bude 2.2.6 a další chování je určeno zvolenou hodnotou RollForward. Stejný efekt by měla publikace aplikace v režimu SCD (zvolený runtime by se přibalil k aplikaci).
Závěr
Je důležité si uvědomit, že vývojáři mohou v jeden moment nevědomě pracovat s různými verzemi frameworku. Pokud nemáte nastavený build server a publikujete aplikace přímo z vývojářského počítače, pak taktéž každý vývojář může publikovat aplikaci s odlišným nastavením. Řešíte-li v souvislosti s ASP.NET Core podivné anomálie, pak dost možná bojujete s výše uvedenými nastaveními. Na závěr dodávám, že nastavení jsem uváděl vzhledem k verzi .NET Core 3.0+. Starší verze runtime mají trochu odlišná nastavení.