2026 年每日通報的 CVE 數量比前一年多 131%。

相依套件

什麼是相依關係圖?

相依關係圖描繪出您的軟體所依賴的每個套件,以及是哪個套件將它引入。清單告訴您軟體裡有什麼;關係圖則告訴您它為什麼在那裡、還牽動哪些部分,而這正是漏洞出現時您會想問的問題。

更新日期

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

節點、邊與路徑

在相依關係圖中,每個套件是一個節點,每個「依賴於」則是從一個套件指向另一個套件的邊。您的專案位於最上層。直接相依套件距離一條邊,而遞移相依套件則是更下層的所有套件。從您的專案到任一套件的路線就是它的相依路徑,而一個套件可能有好幾條路徑。

關係圖、樹狀結構或清單

同一組相依套件可以用三種方式呈現,各自回答不同的問題。

檢視方式 呈現的內容 失去的資訊
扁平清單 每個套件只出現一次,附上版本 每個套件為什麼在那裡
樹狀結構 從您的專案出發的每條路徑,如同套件管理工具的輸出 共用的套件會重複出現,因此樹狀結構會誇大規模
關係圖 每個套件只出現一次,並從每個上層套件各畫一條邊 沒有檢視工具時較難以肉眼閱讀

共用的套件正是關係圖之所以重要的原因。當您的兩個相依套件需要同一個套件時,就會形成菱形:一個節點有兩個上層套件。要修補其中的漏洞,就必須掌握兩條路徑,因為任何一個上層套件都可能將舊版本鎖住。

相依關係圖的用途

  • 找出修補路徑。有漏洞的遞移套件,要透過升級或覆寫其路徑上的某個套件來修正。關係圖會顯示該調整哪個直接相依套件。
  • 評估影響範圍。資安公告發布時,關係圖會顯示您的哪些直接相依套件、服務與產品會通往受影響的套件。
  • 審查授權。位於關係圖深處的 copyleft 授權,與位於最上層的同樣適用,而路徑會告訴您是哪個相依套件將它引入。
  • 規劃升級。一個套件的主要版本升級,會改變它之下的所有內容。關係圖會顯示您的樹狀結構有多少部分會跟著變動。
  • 發現風險集中之處。許多路徑都會經過的小型、無人維護套件,就是單一故障點。

如何取得相依關係圖

從您的套件管理工具。每個套件管理工具都能輸出解析後的樹狀結構,大多數也能說明單一套件為什麼會在那裡。遞移相依套件一頁列出了 npm、pnpm、Python、Go、Rust、Maven 與 Gradle 的指令。

從 GitHub。儲存庫 Insights 分頁下的相依關係圖,彙整了儲存庫中的 manifest 與 lockfile,以及透過 dependency submission API 提交的相依套件。在支援的生態系中,GitHub 會顯示引入每個相依套件的遞移路徑,並可將關係圖匯出為 SBOM。

從 SBOM。CycloneDX 將關係圖記錄在 dependencies 區段中,每個元件會列出它所依賴的內容。SPDX 則在套件之間使用 DEPENDS_ON 關係。以下是 Express 應用程式一部分的 CycloneDX 關係圖:

"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"] }
]

這裡的 debug 出現在兩個上層套件之下,形成菱形。許多 SBOM 省略了這些關係,只列出元件,雖然保留了資產清冊,卻失去了所有路徑。

關係圖的品質取決於其來源

大多數相依關係圖是根據 manifest 與 lockfile 建立的,因此呈現的是套件管理工具規劃的樹狀結構。它們不會顯示從 CI 快取還原的套件、由設定步驟安裝的建置工具,或是由安裝腳本與下載取得的程式碼,也無法判斷建置是否完全依照 lockfile 安裝。請參閱為什麼鎖定檔不等於實際出貨內容的記錄。

CRACI 中的相依關係圖

CRACI 從建置本身建立關係圖。它是一個 GitHub Actions 執行器,會將每個作業取用的每個套件,在樹狀結構的每一層(包括從 CI 快取還原的套件)記錄到一份會標示自身完整性的 SBOM 中。

  • SBOM 的關係圖檢視。相依套件檢視以 Pivot、Graph、Blob、Chord 與 Sunburst 等檢視方式呈現 SBOM 的相依層級,並可依深度與嚴重程度篩選。
  • 包含完整樹狀結構的匯出。CycloneDX 與 SPDX 匯出檔包含遞移相依套件,每個都附有其宣告的授權。
  • 受影響建置的歷程。當新漏洞出現時,建置歷史會顯示哪些過往建置含有該漏洞套件,無論是直接或遞移相依。

請參閱 CRACI 的 SBOM 產生,或預約示範,探索您自己某次建置的關係圖。

相依關係圖:常見問題

什麼是相依關係圖?

相依關係圖是一張地圖,涵蓋您的軟體所依賴的每個套件,並從每個套件畫出箭頭指向它所需要的套件。它不僅呈現您的軟體裡有什麼,也說明原因:從您的程式碼到每個遞移相依套件的路徑。

相依樹與相依關係圖有什麼不同?

樹狀結構會分別呈現每條路徑,因此兩個上層套件都需要的套件會出現兩次。關係圖則讓每個套件只出現一次,並從每個需要它的上層套件各畫一條邊。套件管理工具輸出樹狀結構,是因為容易閱讀;分析影響範圍的工具則以關係圖運作。

SBOM 會包含相依關係圖嗎?

可以包含。CycloneDX 有 dependencies 區段,每個元件會列出它所依賴的元件;SPDX 則以 DEPENDS_ON 關係表達相同的內容。許多 SBOM 省略了這些關係,只列出元件,因此失去了路徑資訊。

如何查看 GitHub 儲存庫的相依關係圖?

開啟儲存庫的 Insights 分頁並選擇 Dependency graph。GitHub 會根據儲存庫中的 manifest 與 lockfile,加上透過其 dependency submission API 提交的內容建立關係圖;在支援的生態系中,還會顯示引入每個遞移相依套件的路徑。

什麼是菱形相依?

您的兩個相依套件都依賴同一個套件,使關係圖形成菱形。如果它們需要該套件互不相容的版本,套件管理工具就必須安裝兩份,否則便會失敗;這正是關係圖比表面上更難管理的原因之一。

看清您的建置實際取用了什麼

在 CRACI 上執行一個 GitHub Actions 工作流程,並在樹狀結構的每一層探索其記錄 SBOM 的相依關係圖。

預約示範