Miroslav Holec
Premium

Jak nastavit verzi ASP.NET Core runtime na vývojářském a produkčním prostředí

Miroslav Holec   2. října 2019

Článek se vztahuje k verzi produktu ASP.NET Core 3.0

Tento článek je již zastaralý. Článek 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í.