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í.
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'))}"
&{$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
.
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
.
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.
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í.
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:
- Napíšete kód přímo do
project.json
(doporučeno) - 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.
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.
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.