【野外求生系列】列舉專案需要的 .NET NuGet 依賴套件
| | | 0 | |
NuGet 套件間常存在依賴關係,例如:ClosedXML 0.105.0 需要 DocumentFormat.OpenXml (>= 3.1.1 && < 4.0.0),而 DocumentFormat.OpenXml 需要 DocumentFormat.OpenXml.Framework (>= 3.3.0),DocumentFormat.OpenXml.Framework 又需要 System.IO.Packaging (>= 8.0.1)。

正常情況下,我們不需理會這團錯綜複雜的關聯,反正 dotnet add package ClosedXML 時 NuGet 機制會打理好一切,依循依賴關係自動找到所需套件下載安裝,這等瑣事髒活兒不需我們費心。
BUT! 在地球的某些角落,連上 NuGet 自動下載套件是種奢求,此時我們需要整理需要的套件清單,逐一手動下載 .nupkg 檔案,彙整後傳送到離線環境供專案編譯時引用。參考:PowerShell 小工具 - 自動補齊離線安裝 NuGet 套件
當時代推進到 .NET 9/10,對 NuGet 的依賴程度遠高於 .NET Framework,幾乎絕大部分套件都改放在 NuGet 伺服器,連 Microsoft.*、System.* 等 .NET 基礎類別程式庫也不再隨 SDK 一次安裝,而是有需要再從網路下載,這該準備離線安裝套件檔的任務益發複雜。
這篇來說說如何一次列出專案引用的 NuGet 套件以及它們依賴的套件,以及依賴套件所依賴的套件 (所謂 Transitive Packages)... 不斷遞迴,盤點所有用到的套件清單,方便用 PowerShell 工具批次下載。
好消息是 .NET CLI 已內建相關功能,用 dotnet list package --include-transitive,--list-transitive 即可列出所有用到的套件,包含依賴套件。
註:依賴套件是口語說法,專業名詞是 Transitive Package,由 Direct 或 Transitive 帶入的都算:
專案
├─ 直接添加:Newtonsoft.Json (Direct Dependency)
│ ├─ Newtonsoft.Json 依賴 System.Runtime (Transitive Dependency)
│ └─ Newtonsoft.Json 依賴 System.Reflection (Transitive Dependency)
│ └─ System.Reflection 依賴 System.Collections
│ (Transitive Dependency 的 Transitive Dependency)
用參照 ClosedXML、SignalR Client 的專案當例子,如下圖,可轉移的套件(Transitive Packages) 即為因為引用 ClosedXML 和 SignalR Client 間接引用的套件:

理論上,照著列出的 Package 名稱與版本下載好 .nupkg,就能順利在離線環境編譯專案囉~
這個清單真的包含依賴套件再延伸出去的依賴套件嗎?有個 dotnet nuget why <csproj name> <package name> 指令可以驗證這點,它會追蹤專案與特定套件的依賴關係是如何發生的。以文章開始舉的 System.IO.Packaging 為例,查出的關聯即先前的描述的依賴層級一致:

除了內建 CLI,有不少第三方工具可以將依賴關係視覺化,或是從 /obj/project.assets.json 我們也能自己建出依賴關係的樹狀結構:

不過,就彙整所需套件以利人工下載的需求,用 dotnet list package --include-transitive 應該就夠了。各位住在荒島的朋友,野外求生系列我們下次再見。
Shows how to list all direct and transitive NuGet dependencies using dotnet CLI for offline package preparation.
Comments
Be the first to post a comment