DNVM, DNX, DNU a správa NuGet packages

Microsoft se otevírá, .NET je open-source a s tím se pojí i rozšíření .NET Framework na platformy mimo Windows. Miroslav Holec sepsal podrobný popis, jak pracovat s DNX (.NET Execution Environment), DNVM (.NET Version Manager) a DNU (NDX Utility) a my vám ho teď přinášíme.

Martin


Pokud sledujete novinky kolem nového ASP.NET 5 (viz. můj článek o novinkách pro webové vývojáře), pak si zřejmě pokládáte i otázku, jak Microsoft zařídil, aby bylo možné pracovat s .NET Frameworkem na alternativních platformách Linux nebo Mac. Odpovědí na tuto otázku je DNX a právě o něm a o DNVM je tento článek.

Seznamte se s DNX

DNX, jinak také .NET Execution Environment obsahuje řadu nástrojů a SDK, díky čemuž můžete spouštět aplikace napsané v .NETu na alternativních platformách. Hned v úvodu se hodí poznamenat, že DNX je stejně jako snad všechny nově představené nástroje od Microsoftu open source a je dostupný na GitHubu. Pokud jste se v minulosti setkali s názvem Project K, pak uveďme na pravou míru:

KRE => DNXKVM => DNVMaspnet50 => dnx451/dnx452aspnetcore50 => dnxcore50

Aby měl vývojář bez ohledu na platformu možnost spravovat různé verze DNX, je k tomu potřeba DNVM (.NET version manager) . Je více možností, jak se k tomuto nástroji dostat. Máte-li nainstalované nové Visual Studio 2015, pak máte určitě nainstalované i DNVM. V jiném případě je potřeba tento nástroj doinstalovat (viz. dále).

Společně s DNVM a staženým DNX je k dispozici i DNU (DNX Utility) . Tento příkaz primárně umožňuje instalovat nebo obnovovat NuGet balíčky. Kromě práce s NuGet balíčky poskytuje DNU také funkcionalitu Build pro sestavování balíčků. DNU využívá stejné prostředky jako NuGet.exe a nabízí tedy i stejnou množinu funkcí.

DNVM, DNU a DNX

Teď když už je doufám zřejmé, k čemu co slouží, pojďme se podívat na instalaci DNVM na všech platformách.

Instalace DNVM na Windows

Pokud jako vývojářské prostředí používáte Visual Studio, nemusíte dělat vůbec nic. DNVM totiž běží na pozadí a o všechno se stará úplně sám. V ostatních případech lze samostatnou instalaci provést spuštěním PowerShell scriptu buď pomocí cmd.exe nebo přímo Powershellu. V případě cmd stačí odeslat příkaz:

@powershell -NoProfile -ExecutionPolicy unrestricted -Command ``"&{$Branch='dev';iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/aspnet/Home/dev/dnvminstall.ps1'))}" Instalace DNVM &{$Branch=``'dev'``;iex ((``new``-``objectnet.webclient).DownloadString(``'https://raw.githubusercontent.com/aspnet/Home/dev/dnvminstall.ps1'``))}

Tím je stažen DNVM a přidán do uživatelského profilu. Cestu lze zkontrolovat v cmd příkazem where dnvm

Instalace DNVM v OS X

Instalace DNVM v OS X je nejsnazší pomocí package manageru Homebrew. Jakmile máte tento balíčkovací systém k dispozici, lze si nainstalovat DNVM pomocí příkazů:

brew tap aspnet/dnxbrew updatebrew install dnvm

Instalace DNVM na Linux

Protože platforma Linux jde trochu mimo mě, dovolím si odkázat na podrobný článek s postupem instalace funkčním minimálně na Debian a Ubuntu. Pokud patříte mezi pokročilejší uživatele jiných distribucí a jejich derivátů, pak se postup zřejmě nebude moc lišit.

Základní použití DNVM

Pokud máte úspěšně nainstalován DNVM, můžete zkontrolovat nastavení a vyjet si nápovědu. Stačí spustit cmd.exe a zadat příkaz dnvm.

DNVM

Pokud příkaz nezafunguje, je možné, že není nastavena proměnná DNX_HOME. Typické nastavení proměnné je %USERPROFILE%.dnx (tedy v uživatelském adresáři). Lze si to i ověřit pomocí příkazu where dnvm.

Where is DNVM

K dispozici je celá řada dalších proměnných, o kterých se dočtete ve wiki v článku Environment Variables.

Aktualizaci DNX lze provést příkazem dnvm upgrade, případně lze zahrnout i beta verze zadáním příkazu s přepínačem dnvm upgrade -n (unstable).

Zjistit seznam aktuálních verzí DNX lze příkazem dnvm list. Ve výpise je vidět i výchozí verze. Příkazem dnvm use se pak může nastavit požadovaná verze DNX.

DNVM List

DNX má ještě řadu dalších užitečných nastavení, která jsou ukrytá v souboru secrets.json. Více se dočtete ve wiki v článku DNX Secret Configuration.

DNU

Nyní už je možné stáhnout libovolný ukázkový projekt postavený na ASP.NET 5 a vyzkoušet, zda funguje restore NuGet balíčků pomocí DNX Utility. Pokud máte nainstalované Visual Studio 2015, můžete si zkusmo založit nějaký ASP.NET 5 projekt a následně se k němu pomocí cmd nascopovat. Až budete nascopovaný na projektu, stačí odeslat příkaz dnu restore, který se postará o aktualizaci závislostí.

DNU Restore

Máte-li stále otevřené Visual Studio 2015, všimněte si, že v Output window najdete také zmínku o provedeném update. DNU si totiž hlídá soubor sám a i bez odpálení dnu restore se balíčky při změně souboru project.json průběžně stahují.

Pokud je potřeba nainstalovat nový balíček, lze použít příkaz dnu install <package id>. Zajímavý je také příkaz pro zobrazení všech závislostí v projektu pomocí dnu list.

Project.json

Kompletní popis json souboru project.json lze nalézt v samopopisném jsonschema. Tento soubor je pro DNX základním zdrojem informací o referencích v projektu. Kromě toho slouží k řadě dalších nastavení projektu, které v tomto článku nebudu popisovat. V souvislosti s DNX je zajímavá sekce Dependencies. Pokud chcete přidat novou knihovnu do projektu (například Newtonsoft.Json), máte dvě možnosti:

  1. Napíšete kód přímo do project.json (doporučeno)
  2. Přidáte referenci starým způsobem (add references nad projektem)

V prvním případě po uložení DNX zaznamená změnu v souboru a sám si stáhne požadované NuGet balíčky. V případě druhém Visual Studio aktualizuje nejprve soubor project.json a poté se stane to samé co v prvním případě.

Souboru project.json se není třeba bát, protože v něm funguje skvěle IntelliSense.

IntelliSense v project.json

Nejen, že tak dostanete nápovědu související s dostupnými balíčky ale dostanete na výběr i všechny verze daného NuGet balíčku (včetně těch neprodukčních).

{ ``   "dependencies"``: { ``      "Newtonsoft.Json"`` : ``"7.0.1-beta3"`` , ``// nuget package ``      "BusinessLayer"`` : ``"1.0.0-*"// reference na c# class library ``   }}

Výstupem C# projektu BusinessLayer v ukázce bude opět NuGet balíček. Aby vše správně fungovalo, je ještě potřeba ve vlastnostech projektu zakliknout na záložce Build možnost "Produce outputs on build". Po provedení kompilace se ve složce solution artifacts/bin/BusinessLayer/Debug vytvoří nuget balíček a ve složkách dnx451/dnxcore50 pak samotný zkompilovaný dll soubor.

Project properties

Vzhledem k tomu, že vývojář má typicky nareferencovanou celou řadu NuGet balíčků, je nutné řešit závislosti mezi balíčky a verzemi. Při spuštění aplikace runtime projde strom závislostí a donačítá všechny potřebné závislosti. Do této části procesu spadá i rozhodování o tom, jaký balíček bude stažen v případě, že je ve stromu závislostí více verzí téhož balíčku.

Nearest wins

Je-li vytvořen strom závislostí, jehož kořenem je samotná aplikace, pak je v případě konfliktu preferována verze balíčku, která je nejblíže kořeni takového stromu.

Minimum acceptable version

Může nastat situace, kdy dva potomci jednoho uzlu stromu mají závislost na dvě odlišné verze určitého balíčku. Pak jsou stejně vzdálené od kořene stromu a výše uvedené pravidlo nelze uplatnit. Přednost pak dostane nejnižší možná verze balíčku, která splňuje požadavky definované závislostmi.

Project.lock.json

Po zavolání příkazu dnu restore jste si možná na výstupu všimli, že nedojde jen k zápisu do souboru project.json ale také do project.lock.json. Tento soubor lze považovat jako složku balíčků, která projektu říká, jakou množinu balíčků může použít ke kompilaci a spuštění . Kromě toho tento soubor obsahuje dále seznam relevantních souborů a dalšího obsahu ke kompilaci. Díky tomu runtime může číst rovnou tento soubor místo množiny různých souborů se specifikacemi. Poslední funkce je podobná jako v případě packages.config a slouží k obnovení závislostí při práci se source controllem.

Závěr

I když může celý koncept působit zmatečně, webový vývojář na platformě Windows se o nic nemusí starat. Po instalaci Visual Studia 2015 je možné vytvářet ASP.NET 5 webové projekty a zasahovat do projektového souboru project.json aniž by vývojář musel znát, jakým způsobem funguje DNVM/DNX/DNU. Právě proto budu souboru project.json věnovat některý z dalších článků.


Aktualizovanou verzi tohoto článku najdete také na Mirkově blogu.