V roce 2026 o 131% více nahlášených CVE denně než loni.

Závislosti

Co je graf závislostí?

Graf závislostí mapuje všechny balíčky, na kterých váš software závisí, a který balíček je do projektu přinesl. Seznam vám řekne, co ve vašem softwaru je. Graf vám řekne, proč tam je a čeho dalšího se dotýká, a právě na to se ptáte, když se objeví zranitelnost.

Aktualizováno

The same dependencies as a tree and as a graph As a tree, express leads to body-parser and send, and debug appears twice, once under each. As a graph, debug is a single node with an edge from body-parser and an edge from send, forming a diamond. Tree shared packages repeat express body-parser send debug debug Graph one node, two parents express body-parser send debug

Uzly, hrany a cesty

V grafu závislostí je každý balíček uzlem a každé „závisí na“ je hranou od jednoho balíčku k druhému. Váš projekt je nahoře. Jeho přímé závislosti jsou o jednu hranu níž a jeho tranzitivní závislosti jsou vše, co leží ještě hlouběji. Trasa od projektu k libovolnému balíčku je jeho cesta závislostí a jeden balíček jich může mít několik.

Graf, strom nebo seznam

Stejné závislosti lze zobrazit třemi způsoby a každý odpovídá na jinou otázku.

Zobrazení Co ukazuje Co ztrácí
Plochý seznam Každý balíček jednou, s jeho verzí Proč tam každý balíček je
Strom Každou cestu od projektu, jak ji vypisují správci balíčků Sdílené balíčky se opakují, takže strom nadsazuje velikost
Graf Každý balíček jednou, s hranou od každého rodiče Bez prohlížeče se okem čte hůř

Právě kvůli sdíleným balíčkům na grafech záleží. Když dvě vaše závislosti potřebují stejný balíček, vznikne diamant: jeden uzel se dvěma rodiči. Opravit v něm zranitelnost znamená znát obě cesty, protože starou verzi může připnout kterýkoli z rodičů.

K čemu graf závislostí použijete

  • Hledání cesty k opravě. Zranitelný tranzitivní balíček opravíte upgradem nebo přepsáním něčeho na jeho cestě. Graf ukáže, kterou přímou závislost posunout.
  • Měření rozsahu dopadu. Když vyjde bezpečnostní upozornění, graf ukáže, které vaše přímé závislosti, služby a produkty vedou k dotčenému balíčku.
  • Kontrola licencí. Copyleftová licence hluboko v grafu platí stejně jako licence nahoře a cesta prozradí, která závislost ji přinesla.
  • Plánování upgradů. Velký upgrade jednoho balíčku změní vše pod ním. Graf ukáže, jak velká část stromu se pohne.
  • Odhalení koncentrace rizika. Malý, neudržovaný balíček, přes který vede mnoho cest, je jediným bodem selhání.

Jak graf závislostí získat

Ze správce balíčků. Každý správce balíčků vypíše vyřešený strom a většina umí vysvětlit, proč tam konkrétní balíček je. Stránka tranzitivní závislosti uvádí příkazy pro npm, pnpm, Python, Go, Rust, Maven a Gradle.

Z GitHubu. Dependency graph na kartě Insights repozitáře je souhrn manifestů a lockfilů v repozitáři a závislostí odeslaných přes dependency submission API. U ekosystémů, které to podporují, GitHub ukazuje tranzitivní cestu, kterou se do projektu dostala každá závislost, a graf umí exportovat jako SBOM.

Ze SBOM. CycloneDX zaznamenává graf v sekci dependencies, kde každá komponenta uvádí, na čem závisí. SPDX používá mezi balíčky vztahy DEPENDS_ON. Graf CycloneDX pro část aplikace v Expressu vypadá takto:

"dependencies": [
  { "ref": "my-app", "dependsOn": ["express"] },
  { "ref": "express", "dependsOn": ["body-parser", "send"] },
  { "ref": "body-parser", "dependsOn": ["raw-body", "debug"] },
  { "ref": "send", "dependsOn": ["mime-types", "debug"] }
]

Balíček debug se zde objevuje pod dvěma rodiči: diamant. Mnoho SBOM vztahy vynechává a uvádí jen komponenty, takže inventář zůstane, ale všechny cesty se ztratí.

Graf je jen tak dobrý jako jeho zdroj

Většina grafů závislostí se sestavuje z manifestů a lockfilů, takže ukazuje strom, který naplánoval správce balíčků. Neukazuje balíčky obnovené z cache CI, nástroje pro build nainstalované v krocích setup ani kód stažený instalačními skripty a stahováním a nedokáže říct, zda build nainstaloval přesně to, co je v lockfilu. Podívejte se, proč lockfile není záznamem toho, co bylo dodáno.

Grafy závislostí v CRACI

CRACI sestavuje svůj graf přímo z buildu. Je to runner GitHub Actions, který zaznamenává každý balíček, který každý job stáhne, v jakékoli hloubce stromu a včetně balíčků obnovených z cache CI, do SBOM, která uvádí vlastní úplnost.

  • Zobrazení SBOM jako grafu. Zobrazení závislostí ukazuje vrstvy závislostí SBOM v pohledech Pivot, Graph, Blob, Chord a Sunburst s filtry podle hloubky a závažnosti.
  • Exporty s celým stromem. Exporty CycloneDX a SPDX obsahují tranzitivní závislosti, každou s její deklarovanou licencí.
  • Dotčené buildy v čase. Když se objeví nová zranitelnost, historie buildů ukáže, které dřívější buildy obsahovaly zranitelný balíček, ať přímo, nebo tranzitivně.

Podívejte se na generování SBOM v CRACI, nebo si rezervujte demo a prozkoumejte graf některého ze svých buildů.

Grafy závislostí: časté dotazy

Co je graf závislostí?

Graf závislostí je mapa všech balíčků, na kterých váš software závisí, se šipkou od každého balíčku k balíčkům, které potřebuje. Neukazuje jen, co ve vašem softwaru je, ale i proč: cestu od vašeho kódu ke každé tranzitivní závislosti.

Jaký je rozdíl mezi stromem závislostí a grafem závislostí?

Strom zobrazuje každou cestu zvlášť, takže balíček, který potřebují dva rodiče, se v něm objeví dvakrát. Graf zobrazuje každý balíček jednou, s hranou od každého rodiče, který ho potřebuje. Správci balíčků vypisují stromy, protože se snadno čtou; nástroje, které analyzují dopad, pracují s grafem.

Obsahuje SBOM graf závislostí?

Může. CycloneDX má sekci dependencies, ve které každá komponenta uvádí komponenty, na kterých závisí, a SPDX vyjadřuje totéž vztahy DEPENDS_ON. Mnoho SBOM vztahy vynechává a uvádí jen komponenty, čímž se cesty ztrácejí.

Jak zobrazím graf závislostí repozitáře na GitHubu?

Otevřete v repozitáři kartu Insights a zvolte Dependency graph. GitHub ho sestavuje z manifestů a lockfilů v repozitáři a ze všeho, co se odešle přes jeho dependency submission API, a u ekosystémů, které to podporují, ukazuje cestu, kterou se do projektu dostala každá tranzitivní závislost.

Co je diamantová závislost?

Dvě vaše závislosti závisejí na stejném balíčku, takže graf vytvoří diamant. Pokud potřebují jeho nekompatibilní verze, správce balíčků musí nainstalovat dvě kopie, nebo selže, a to je jeden z důvodů, proč se graf spravuje hůř, než se zdá.

Prohlédněte si graf toho, co váš build stáhl

Spusťte jedno workflow GitHub Actions na CRACI a prozkoumejte graf závislostí jeho zaznamenané SBOM v jakékoli hloubce stromu.

Rezervujte si demo