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 zabránilo změnám v jiných knihovnách .NET v narušení knihovny .NET a naopak!

Závislosti kosočtverce

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 kosočtverec.

Diamond dependency

V době sestavení NuGet analyzuje všechny balíčky, na kterých projekt závisí, včetně závislostí 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 závislostí kosočtverce je snadno vyřešena; můžou 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.
  • Rozbíjející 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ěží v rozhraní .NET Framework. Vyžaduje se přesměrování vazby sestavení.

Není možné vědět, jaké balíčky se budou používat společně s vlastními balíčky. Dobrým způsobem, jak snížit pravděpodobnost závislostí diamantů způsobujících vaši knihovnu, 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 překladu závislostí, jsou složitá, ale NuGet ve výchozím nastavení 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 nejnižšímu pravidlu verze NuGet není nutné umístit na odkazy na balíčky horní verzi ani 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šší. Zatímco zásadní změny mohly být zavedeny ve verzi 2.0, přísná nebo horní omezení závislost na verzích zaručuje chybu.

Diamond dependency conflict

❌ 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 zahrnuté v projektu při odkazech. 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.

Shared source package

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

Shared source project

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.