Závislosti

Primárním způsobem přidání závislostí do knihovny .NET je odkazování na balíčky NuGet. Odkazy na balíčky NuGet umožňují rychle opakovaně používat a využívat již napsané funkce, ale představují běžný zdroj tření pro vývojáře .NET. Správná správa závislostí je důležitá, aby se předešlo tomu, že změny v jiných knihovnách .NET poškozí vaši knihovnu .NET, a naopak!

Diamantové závislosti

U projektu .NET je běžné, že má ve stromu závislostí více verzí balíčku. Aplikace například závisí na dvou balíčcích NuGet, z nichž každá závisí na jiné verzi stejného balíčku. V grafu závislostí aplikace teď existuje diamantová závislost.

Diamantová závislost

V době sestavení NuGet analyzuje všechny balíčky, na kterých projekt závisí, včetně závislostí těchto závislostí. Když se zjistí více verzí balíčku, vyhodnotí se pravidla tak, aby ho vybrala. Sjednocení balíčků je nezbytné, protože spuštění souběžných verzí sestavení ve stejné aplikaci je problematické v .NET.

Většina diamantových závislostí je snadno řešena; mohou však za určitých okolností vytvářet problémy:

  • Konfliktní odkazy na balíčky NuGet brání vyřešení verze během obnovení balíčku.
  • Zásadní změny mezi verzemi způsobují chyby a výjimky za běhu.
  • Sestavení balíčku je silně pojmenované, verze sestavení se změnila a aplikace běží na rozhraní .NET Framework. Přesměrování vazby sestavení je vyžadováno.

Není možné vědět, jaké balíčky se budou používat společně s vlastními balíčky. Dobrou metodou, jak snížit pravděpodobnost narušení vaší knihovny kvůli "diamond dependency", je minimalizovat počet balíčků, na které závisíte.

✔️ Zkontrolujte nepotřebné závislosti v knihovně .NET.

Rozsahy verzí závislostí NuGet

Odkaz na balíček určuje rozsah platných balíčků, které umožňuje. Referenční verze balíčku v souboru projektu je obvykle minimální verze a neexistuje žádné maximum.

<!-- Accepts any version 1.0 and above. -->
<PackageReference Include="ExamplePackage" Version="1.0" />

Pravidla, která NuGet používá při řešení závislostí, jsou složitá, ale NuGet standardně hledá nejnižší použitelnou verzi. NuGet upřednostňuje nejnižší platnou verzi před použitím nejvyšší dostupné verze, protože nejnižší budou mít nejmenší problémy s kompatibilitou.

Vzhledem k pravidlu NuGet pro nejnižší použitelnou verzi není nutné nastavovat u odkazu na balíček horní verzi nebo přesný rozsah, abyste se vyhnuli získání nejnovější verze. NuGet se už snaží najít nejnižší a nejkomppatibilnější verzi za vás.

<!-- Accepts 1.0 up to 1.x, but not 2.0 and higher. -->
<PackageReference Include="ExamplePackage" Version="[1.0,2.0)" />

<!-- Accepts exactly 1.0. -->
<PackageReference Include="ExamplePackage" Version="[1.0]" />

Horní limity verzí způsobí selhání NuGetu, pokud dojde ke konfliktu. Jedna knihovna například přijímá přesně 1,0, zatímco jiná knihovna vyžaduje verzi 2.0 nebo vyšší. Ačkoli ve verzi 2.0 mohlo dojít k zásadním změnám, přísná závislost na verzi nebo omezení horní verze zaručuje výskyt chyby.

Konflikt diamantových závislostí

❌ NEPOUŽÍVEJTE odkazy na balíčky NuGet bez minimální verze.

❌ Vyhněte se odkazům na balíčky NuGet, které vyžadují přesnou verzi.

❌ Vyhněte se odkazům na balíčky NuGet s horním limitem verze.

Další informace najdete v tématu Správa verzí balíčků.

Sdílené zdrojové balíčky NuGet

Jedním ze způsobů, jak omezit externí závislosti balíčků NuGet, je odkazovat na sdílené zdrojové balíčky. Sdílený zdrojový balíček obsahuje soubory zdrojového kódu, které jsou zahrnuty do projektu, když jsou referencovány. Vzhledem k tomu, že právě zahrnete soubory zdrojového kódu, které jsou zkompilovány se zbytkem projektu, neexistuje žádná externí závislost a šance na konflikt.

Sdílené zdrojové balíčky jsou skvělé pro zahrnutí malých částí funkcí. Můžete například odkazovat na sdílený zdrojový balíček pomocných metod pro volání HTTP.

Sdílený zdrojový balíček

<PackageReference Include="Microsoft.Extensions.Buffers.Testing.Sources" PrivateAssets="All" Version="1.0" />

Sdílený zdrojový projekt

Sdílené zdrojové balíčky mají určitá omezení. Na tyto projekty lze odkazovat PackageReferencepouze , takže starší packages.config projekty jsou vyloučeny. Sdílené zdrojové balíčky jsou také použitelné pouze projekty se stejným jazykem. Kvůli těmto omezením se sdílené zdrojové balíčky nejlépe používají ke sdílení funkcí v rámci opensourcového projektu.

✔️ ZVAŽTE odkazování na sdílené zdrojové balíčky pro malé interní funkce.

✔️ Zvažte vytvoření sdíleného zdrojového balíčku, pokud poskytuje malé interní funkce.

✔️ Odkazovat na sdílené zdrojové balíčky s PrivateAssets="All".

Toto nastavení říká NuGetu, že se balíček má používat pouze v době vývoje a neměl by být vystaven jako veřejná závislost.

❌ VE veřejném rozhraní API nemáte sdílené typy zdrojových balíčků.

Sdílené zdrojové typy se kompilují do odkazujícího sestavení a nelze je vyměňovat přes hranice sestavení. Například typ sdíleného zdroje IRepository v jednom projektu je samostatný typ od stejného sdíleného zdroje IRepository v jiném projektu. Typy ve sdílených zdrojových balíčcích by měly mít internal viditelnost.

❌ NEpublikujte sdílené zdrojové balíčky do NuGet.org.

Sdílené zdrojové balíčky obsahují zdrojový kód a dají se používat pouze projekty se stejným typem jazyka. Například sdílený zdrojový balíček jazyka C# nelze použít v aplikaci jazyka F#.

Publikujte sdílené zdrojové balíčky do místního informačního kanálu nebo myGet , abyste je interně spotřebovali v rámci projektu.