Úvod do NuGetu

Základním nástrojem pro jakoukoli moderní vývojovou platformu je mechanismus, pomocí kterého můžou vývojáři vytvářet, sdílet a využívat užitečný kód. Tento kód je často součástí "balíčků", které obsahují zkompilovaný kód (jako knihovny DLL) spolu s dalším obsahem potřebným v projektech, které tyto balíčky využívají.

Pro .NET (včetně .NET Core) je mechanismus pro sdílení kódu podporovaný Microsoftem NuGet, který definuje, jak se balíčky pro .NET vytvářejí, hostují a využívají a poskytují nástroje pro každou z těchto rolí.

Jednoduše řečeno, balíček NuGet je jeden soubor ZIP s .nupkg příponou, která obsahuje zkompilovaný kód (DLL), další soubory související s tímto kódem a popisný manifest, který obsahuje informace, jako je číslo verze balíčku. Vývojáři s kódem, kteří sdílejí balíčky, a publikují je na veřejném nebo privátním hostiteli. Příjemci balíčků tyto balíčky získají od vhodných hostitelů, přidají je do svých projektů a pak v kódu projektu volají funkce balíčku. Samotný NuGet pak zpracuje všechny zprostředkující podrobnosti.

Vzhledem k tomu, že NuGet podporuje privátní hostitele společně s veřejným hostitelem nuget.org, můžete pomocí balíčků NuGet sdílet kód, který je výhradní pro organizaci nebo pracovní skupinu. Balíčky NuGet můžete také použít jako pohodlný způsob, jak pro použití v žádném případě použít vlastní kód, ale vlastní projekty. Stručně řečeno, balíček NuGet je sdílená jednotka kódu, ale nevyžaduje ani neznamená žádné konkrétní prostředky sdílení.

Tok balíčků mezi tvůrci, hostiteli a uživateli

Ve své roli jako veřejný hostitel udržuje NuGet centrální úložiště více než 100 000 jedinečných balíčků na nuget.org. Tyto balíčky každý den využívají miliony vývojářů .NET/.NET Core. NuGet také umožňuje hostovat balíčky soukromě v cloudu (například v Azure DevOps), v privátní síti nebo dokonce v místním systému souborů. Díky tomu jsou tyto balíčky k dispozici jenom vývojářům, kteří mají přístup k hostiteli a umožňují zpřístupnit balíčky konkrétní skupině uživatelů. Možnosti jsou vysvětleny při hostování vlastních informačních kanálů NuGet. Prostřednictvím možností konfigurace můžete také určit, ke kterým hostitelům může přistupovat jakýkoli daný počítač, a zajistit tak, aby balíčky byly získány z konkrétních zdrojů, a ne z veřejného úložiště, jako je nuget.org.

Hostitel bez ohledu na svoji povahu slouží jako bod spojení mezi tvůrci balíčků a příjemci balíčků. Tvůrci vytvářejí užitečné balíčky NuGet a publikují je na hostiteli. Uživatelé pak vyhledávají užitečné a kompatibilní balíčky na přístupných hostitelích, stahují a zahrnují tyto balíčky do svých projektů. Po instalaci v projektu jsou rozhraní API balíčků k dispozici pro zbytek kódu projektu.

Relationship between package creators, package hosts, and package consumers

Kompatibilita cílení na balíčky

"Kompatibilní" balíček znamená, že obsahuje sestavení sestavená alespoň pro jednu cílovou architekturu .NET, která jsou kompatibilní s cílovou architekturou projektu využívajícího. Vývojáři můžou vytvářet balíčky, které jsou specifické pro jednu architekturu, jako u ovládacích prvků UPW, nebo mohou podporovat širší škálu cílů. Aby se maximalizovala kompatibilita balíčku, vývojáři cílí na .NET Standard, které můžou využívat všechny projekty .NET a .NET Core. To je nejúčinnější způsob, jak tvůrci, tak spotřebitelé, protože jeden balíček (obvykle obsahuje jedno sestavení) funguje pro všechny náročné projekty.

Vývojáři balíčků, kteří vyžadují rozhraní API mimo .NET Standard, na druhé straně vytvářejí samostatná sestavení pro různé cílové architektury, které chtějí podporovat, a zahrnout všechna tato sestavení do stejného balíčku (který se nazývá "cílení na více"). Když příjemce takový balíček nainstaluje, NuGet extrahuje pouze sestavení potřebná projektem. Tím se minimalizuje nároky balíčku v konečné aplikaci nebo sestaveních vytvořených tímto projektem. Balíček pro cílení na více cílů je samozřejmě pro tvůrce obtížnější udržovat.

Poznámka:

Pokyny k komponentám aplikací vs. opakovaně použitelných knihoven najdete v dokumentaci k .NET Standard v tomto tématu.

Nástroje NuGet

Kromě podpory hostování poskytuje NuGet také řadu nástrojů, které používají tvůrci i spotřebitelé. Informace o získání konkrétních nástrojů najdete v tématu Instalace klientských nástrojů NuGet.

Nástroj Platformy Použitelné scénáře Popis
Rozhraní příkazového řádku dotnet Vše Vytvoření, spotřeba Nástroj CLI pro knihovny .NET Core a .NET Standard a projekty ve stylu sady SDK, které cílí na rozhraní .NET Framework (viz atribut sady SDK). Poskytuje určité funkce rozhraní příkazového řádku NuGet přímo v rámci řetězu nástrojů .NET Core. Stejně jako u rozhraní příkazového nuget.exe řádku nepracuje rozhraní příkazového řádku dotnet s projekty sady Visual Studio.
Rozhraní příkazového řádku nuget.exe Vše Vytvoření, spotřeba Nástroj rozhraní příkazového řádku pro knihovny rozhraní .NET Framework a projekty, které nejsou stylem sady SDK, které cílí na knihovny .NET Standard. Poskytuje všechny funkce NuGet s některými příkazy, které se vztahují speciálně na tvůrce balíčků, některé platí jenom pro uživatele a jiné platí pro oba. Tvůrci balíčků například používají nuget pack příkaz k vytvoření balíčku z různých sestavení a souvisejících souborů, příjemci balíčků používají nuget install zahrnutí balíčků do složky projektu a všichni používají nuget config k nastavení konfiguračních proměnných NuGet. Jako nástroj nezávislý na platformě nepracuje rozhraní příkazového řádku NuGet s projekty sady Visual Studio.
Konzola Správce balíčků Visual Studio ve Windows Využití Poskytuje příkazy PowerShellu pro instalaci a správu balíčků v projektech sady Visual Studio.
Uživatelské rozhraní Správce balíčků Visual Studio ve Windows Využití Poskytuje snadno použitelné uživatelské rozhraní pro instalaci a správu balíčků v projektech sady Visual Studio.
Správa uživatelského rozhraní NuGet Visual Studio pro Mac Využití Poskytuje snadno použitelné uživatelské rozhraní pro instalaci a správu balíčků v Visual Studio pro Mac projektech.
MSBuild Windows Vytvoření, spotřeba Poskytuje možnost vytvářet balíčky a obnovovat balíčky používané v projektu přímo prostřednictvím řetězce nástrojů MSBuild.

Jak vidíte, nástroje NuGet, se kterými pracujete, závisí výrazně na tom, jestli vytváříte, spotřebováváte nebo publikujete balíčky, a platformu, na které pracujete. Tvůrci balíčků jsou obvykle také příjemci, protože vycházejí z funkcí, které existují v jiných balíčcích NuGet. A tyto balíčky samozřejmě můžou záviset na dalších.

Další informace najdete v článku o pracovním postupu vytvoření balíčku a o pracovních postupech o spotřebě balíčků.

Správa závislostí

Schopnost snadno vytvářet práci ostatních je jednou z nejvýkonnějších funkcí systému správy balíčků. Proto většina toho, co NuGet dělá, spravuje tento strom závislostí nebo "graf" jménem projektu. Jednoduše řečeno, potřebujete se zabývat pouze těmito balíčky, které přímo používáte v projektu. Pokud některý z těchto balíčků sám využívá další balíčky (které pak můžou využívat i další), NuGet se postará o všechny tyto závislosti na nižší úrovni.

Následující obrázek znázorňuje projekt, který závisí na pěti balíčcích, které zase závisí na řadě dalších.

An example NuGet dependency graph for a .NET project

Všimněte si, že některé balíčky se v grafu závislostí zobrazují několikrát. Existují například tři různí příjemci balíčku B a každý příjemce může také zadat jinou verzi tohoto balíčku (nezobrazuje se). Jedná se o běžný výskyt, zejména pro široce používané balíčky. NuGet naštěstí pracuje na tom, aby přesně určil, která verze balíčku B splňuje všechny uživatele. NuGet pak udělá totéž pro všechny ostatní balíčky bez ohledu na to, jak hluboko je graf závislostí.

Další podrobnosti o tom, jak NuGet tuto službu provádí, najdete v tématu Řešení závislostí.

Sledování odkazů a obnovení balíčků

Vzhledem k tomu, že se projekty můžou snadno přesouvat mezi vývojářskými počítači, úložišti správy zdrojového kódu, sestavovat servery atd., je velmi nepraktické zachovat binární sestavení balíčků NuGet přímo vázaná na projekt. Tímto způsobem by se každá kopie projektu zbytečně nafoukl (a tím by se ztrácel prostor v úložištích správy zdrojového kódu). Také by bylo velmi obtížné aktualizovat binární soubory balíčků na novější verze, protože aktualizace by se musely použít ve všech kopiích projektu.

NuGet místo toho udržuje jednoduchý referenční seznam balíčků, na kterých projekt závisí, včetně závislostí nejvyšší i nižší úrovně. To znamená, že při každé instalaci balíčku z některého hostitele do projektu nuGet zaznamená identifikátor balíčku a číslo verze v referenčním seznamu. (Odinstalace balíčku samozřejmě odebere ze seznamu.) NuGet pak poskytuje prostředky k obnovení všech odkazovaných balíčků na vyžádání, jak je popsáno v části Obnovení balíčku.

A NuGet reference list is created on package installation and can be used to restore packages elsewhere

Pouze s referenčním seznamem může NuGet později přeinstalovat – tj . obnovit – všechny tyto balíčky z veřejných a/nebo privátních hostitelů. Při potvrzení projektu ke správě zdrojového kódu nebo jeho sdílení jiným způsobem zahrnete pouze referenční seznam a vyloučíte všechny binární soubory balíčků (viz Balíčky a správa zdrojového kódu.)

Počítač, který obdrží projekt, například server sestavení, který získá kopii projektu jako součást systému automatizovaného nasazení, jednoduše požádá NuGet o obnovení závislostí, kdykoli je to potřeba. Pro tento přesný účel poskytují systémy sestavení, jako je Azure DevOps, kroky obnovení NuGet. Podobně platí, že když vývojáři získají kopii projektu (jako při klonování úložiště), můžou vyvolat příkaz jako nuget restore (Rozhraní příkazového řádku NuGet), dotnet restore (rozhraní příkazového řádku dotnet) nebo Install-Package (Správce balíčků konzolu), aby získali všechny potřebné balíčky. Visual Studio ve své části automaticky obnoví balíčky při vytváření projektu (za předpokladu, že je povolené automatické obnovení, jak je popsáno při obnovení balíčku).

Je zřejmé, že primární role NuGetu, kde se vývojáři zabývají, udržuje tento referenční seznam jménem vašeho projektu a poskytuje prostředky pro efektivní obnovení (a aktualizaci) těchto odkazovaných balíčků. Tento seznam se udržuje v jednom ze dvou formátů správy balíčků, jak se nazývají:

  • PackageReference (nebo "odkazy na balíčky v souborech projektu") | (NuGet 4.0+) Udržuje seznam závislostí nejvyšší úrovně projektu přímo v souboru projektu, takže není potřeba žádný samostatný soubor. Přidružený soubor , je dynamicky generován za účelem správy celkového grafu závislostí balíčků, obj/project.assets.jsonkteré projekt používá spolu se všemi závislostmi nižší úrovně. PackageReference je vždy používán projekty .NET Core.

  • packages.config: (NuGet 1.0+) Soubor XML, který udržuje plochý seznam všech závislostí v projektu, včetně závislostí jiných nainstalovaných balíčků. Nainstalované nebo obnovené balíčky se ukládají do packages složky.

Který formát správy balíčků se používá v libovolném projektu, závisí na typu projektu a na dostupné verzi NuGetu (nebo v sadě Visual Studio). Pokud chcete zkontrolovat, jaký formát se používá, jednoduše po packages.config instalaci prvního balíčku vyhledejte v kořenovém adresáři projektu. Pokud tento soubor nemáte, vyhledejte v souboru projektu přímo <element PackageReference> .

Pokud máte na výběr, doporučujeme použít PackageReference. packages.config se udržuje pro starší účely a již není aktivní vývoj.

Tip

Různé nuget.exe příkazy rozhraní příkazového řádku, například nuget install, nepřidávejte balíček do referenčního seznamu automaticky. Seznam se aktualizuje při instalaci balíčku pomocí sady Visual Studio Správce balíčků (uživatelské rozhraní nebo konzoly) a pomocí dotnet.exe rozhraní příkazového řádku.

Co ještě NuGet dělá?

Zatím jste se seznámili s následujícími vlastnostmi NuGetu:

  • NuGet poskytuje centrální úložiště nuget.org s podporou privátního hostování.
  • NuGet poskytuje vývojářům nástrojů, které potřebují k vytváření, publikování a využívání balíčků.
  • Nejdůležitější je, že NuGet udržuje referenční seznam balíčků používaných v projektu a možnost obnovit a aktualizovat tyto balíčky z tohoto seznamu.

Aby tyto procesy fungovaly efektivně, NuGet provede některé optimalizace na pozadí. NuGet především spravuje mezipaměť balíčků a globální složku balíčků pro zástupce instalace a přeinstalace. Mezipaměť se vyhne stahování balíčku, který už je na počítači nainstalovaný. Globální složka balíčků umožňuje více projektům sdílet stejný nainstalovaný balíček, čímž se sníží celková stopa NuGetu na počítači. Složka s mezipamětí a globálními balíčky jsou také velmi užitečná, když často obnovujete větší počet balíčků jako na buildovém serveru. Další podrobnosti o těchtomechanismch

V rámci jednotlivých projektů spravuje NuGet celkový graf závislostí, který znovu zahrnuje překlad více odkazů na různé verze stejného balíčku. Je docela běžné, že projekt přebírá závislost na jednom nebo více balíčcích, které mají stejné závislosti. Některé z nejužitečnějších balíčků nástrojů na nuget.org jsou používány mnoha dalšími balíčky. V celém grafu závislostí pak můžete mít snadno deset různých odkazů na různé verze stejného balíčku. Aby se zabránilo přenesení více verzí tohoto balíčku do samotné aplikace, NuGet seřadí, kterou jednu verzi můžou používat všichni příjemci. (Další informace najdete v tématu Řešení závislostí.)

Kromě toho NuGet udržuje všechny specifikace týkající se strukturování balíčků (včetně lokalizačních a ladicích symbolů) a jejich odkazování (včetně rozsahů verzí a předběžných verzí).) NuGet také poskytuje různá rozhraní API pro práci se službami prostřednictvím kódu programu a poskytuje podporu vývojářům, kteří píší rozšíření sady Visual Studio a šablony projektů.

Chvíli si projděte obsah této dokumentace a uvidíte zde všechny tyto funkce a poznámky k verzi, které se zobrazují zpět na začátku NuGetu.

Další videa NuGet najdete na Webu Channel 9 a YouTube.

Komentáře, příspěvky a problémy

Nakonec velmi vítáme komentáře a příspěvky do této dokumentace – stačí vybrat příkazy Pro názory a úpravy v horní části libovolné stránky nebo navštívit úložiště dokumentů a seznam problémů s dokumenty na GitHubu.

Vítáme také příspěvky samotného NuGetu prostřednictvím různých úložišť GitHubu; Problémy s NuGetem najdete na webu https://github.com/NuGet/home/issues.

Užijte si prostředí NuGet!