8.5 KiB
name, description, argument-hint
| name | description | argument-hint |
|---|---|---|
| code-review-nuget | 將 C# / .NET 專案的 NuGet 套件更新到最新可用版本。當使用者要求更新 NuGet、升級 PackageReference、清理重複套件參考、檢查專案參考中的重複 NuGet、或逐包更新並確認 build 時觸發。流程會依專案分組列出套件,檢查 ProjectReference 上層專案是否已引用相同套件並移除可安全移除的重複參考,接著逐一更新套件版本;每更新或移除一個套件都必須 restore/build 驗證。不適用於:非 .NET 專案、只想查詢套件清單不更新、或只要人工建議不修改檔案。 | [<solution-or-project>] [--include-prerelease] [--no-dedupe] [--build <command>] [--yes] |
code-review-nuget — 更新 C# 專案 NuGet 套件
把 C# / .NET repo 內的 NuGet 套件依專案盤點、清理可安全移除的重複參考,然後逐一更新到最新可用版本。每個套件異動後都要驗證專案可以正常編譯;若失敗,回復該套件異動並記錄原因,繼續處理下一個可獨立處理的套件。
輸出規範
- 所有面向使用者的輸出一律使用繁體中文(台灣用語);套件 id、檔名、指令、版本號保留原文。
- 修改前先輸出簡短執行計畫;除非使用者要求確認、遇到多個 solution 無法判斷、或編譯失敗需要取捨,否則依計畫執行。
- 每個套件都要留下結果:已更新 / 已略過 / 已回復 / 已移除重複參考,以及對應版本與驗證指令。
- 不主動 commit、push 或開 PR;使用者明確要求時才做。
參數
[<solution-or-project>] [--include-prerelease] [--no-dedupe] [--build <command>] [--yes]
<solution-or-project>:.sln、.slnx或.csproj路徑。省略時自動搜尋;若找到多個 solution 且無法判斷主專案,必須詢問。--include-prerelease:更新時允許 prerelease 版本;未指定時只更新 stable 版本。--no-dedupe:略過 ProjectReference 重複 PackageReference 清理,只更新版本。--build <command>:覆寫驗證指令,例如dotnet build My.sln -c Release。未指定時用dotnet build <solution-or-project> --no-restore。--yes:可略過一般確認,但仍不可忽略多 solution 選擇、無法安全清理重複參考、或編譯失敗的必要決策。
執行流程
1. 探測專案與工具
-
確認目前在 repo 根目錄或可找到 git root。
-
檢查工具:
dotnet --info dotnet --list-sdks -
找出目標:
- 參數有指定
.sln/.slnx/.csproj→ 使用該路徑。 - 未指定 → 依序搜尋
.slnx、.sln、.csproj。 - 多個 solution 且無明顯唯一主檔 → 詢問使用者選擇,不可猜測。
- 參數有指定
-
先執行 baseline 驗證:
dotnet restore <目標> dotnet build <目標> --no-restorebaseline build 失敗時停止,回報現況;不要在不可編譯的基準上升級套件。
2. 依專案分組列出 NuGet 套件
-
找出目標涵蓋的所有
.csproj:- solution:可用
dotnet sln <solution> list,必要時解析輸出中的.csproj。 - 單一 project:只處理該 project 與其 ProjectReference 圖。
- solution:可用
-
對每個專案列出 direct 套件:
dotnet list <project.csproj> package --outdated dotnet list <project.csproj> package --include-transitive -
讀取
.csproj、Directory.Packages.props、Directory.Build.props,判斷是否使用 Central Package Management(ManagePackageVersionsCentrally/PackageVersion)。 -
產出「依專案分組」清單:
專案 套件 目前版本 最新版本 參考來源 備註 參考來源標註PackageReference、Directory.Packages.props、transitive或ProjectReference。
3. 檢查 ProjectReference 重複套件
這裡的「上層專案」指目前專案透過
ProjectReference直接或間接參考到的專案;若該被參考專案已 direct reference 同一個 NuGet 套件,且該套件會透過專案參考傳遞,當前專案通常不需要重複 direct reference。
- 建立 ProjectReference graph:
- 讀每個
.csproj的<ProjectReference Include="...">。 - 正規化路徑,建立「目前專案 → 被參考專案」的 direct / transitive 關係。
- 讀每個
- 比對 direct PackageReference:
- 若目前專案與其 direct/transitive ProjectReference 上層專案有相同套件 id,列為重複候選。
- 若目前專案的套件參考含
PrivateAssets="all"、IncludeAssets/ExcludeAssets特殊設定、analyzers/build/source generators、或版本刻意高於上層專案,先列為「需人工確認」,不要自動移除。 - 若上層專案的參考含
PrivateAssets="all"或不會傳遞必要 assets,不可視為可替代。
- 對可安全移除的重複 direct reference 逐一處理:
-
先記錄目前檔案狀態與套件版本。
-
移除當前專案的重複
PackageReference;若使用 Central Package Management,只有在沒有任何專案仍需要該PackageVersion時才移除中央版本項。 -
執行:
dotnet restore <目標> dotnet build <目標> --no-restore -
build 成功 → 保留移除。
-
build 失敗 → 回復該移除,重新 restore/build 確認回復後可編譯,並記錄失敗原因。
-
4. 逐一更新套件版本
-
排除不應更新的項目:
- transitive-only 套件不直接更新;更新提供它的 direct 套件。
- 明確 pin 住版本且註解或 props 顯示有相容性原因者,先列入「需人工確認」。
PrivateAssets="all"的 analyzer / generator / build tooling 可更新,但要特別注意 build 驗證結果。
-
逐一更新 direct 套件:
- 一次只更新一個套件 id。
- 若多個專案引用同一套件,先判斷是否使用 Central Package Management:
- CPM:更新對應
Directory.Packages.props的單一PackageVersion。 - 非 CPM:依專案逐一更新該套件。
- CPM:更新對應
- 優先使用
dotnet add <project> package <PackageId>讓 NuGet 選擇最新相容 stable 版本;若dotnet list package --outdated已提供最新版本,也可用--version <latest>明確更新。 - 指定
--include-prerelease時,查詢與更新都允許 prerelease;未指定時不得升到 prerelease。
-
每更新一個套件後立即驗證:
dotnet restore <目標> dotnet build <目標> --no-restore若使用者提供
--build <command>,以該命令取代 build 步驟,但 restore 仍需執行。 -
驗證結果:
- 成功:記錄
PackageId oldVersion -> newVersion,保留變更。 - 失敗:回復該套件異動與 lock file 變更,重新 restore/build 確認回復後可編譯;記錄為「已回復」並摘要錯誤。
- 因相依套件版本衝突導致失敗:可嘗試更新同一 dependency chain 中的必要 direct 套件,但仍必須一次一包、每包驗證。
- 成功:記錄
5. 特殊檔案與版本管理
packages.lock.json存在時,更新套件後允許 lock file 跟著變更;回復失敗更新時也要回復 lock file。nuget.config有私有 feed 時,不輸出 credential;錯誤訊息若含 token / password 必須遮蔽。packages.config專案不套用dotnet add package流程;先回報這是舊格式,使用nuget.exe update或請使用者確認遷移策略。- 多 target framework 專案以完整目標 build 為準,不只 build 單一 framework。
6. 最終總結
完成後輸出:
| 類別 | 套件 / 專案 | 結果 |
|---|
至少包含:
- 重複 PackageReference:移除幾筆、回復幾筆、需人工確認幾筆。
- NuGet 更新:成功幾筆、已是最新幾筆、回復幾筆、略過幾筆。
- 最後一次成功驗證的指令。
- 尚待人工處理的套件與原因。
若所有變更後最終 build 成功,明確寫「最終編譯驗證成功」。若有套件因失敗被回復,說明目前工作區保留的是已通過 build 的變更集合。
呼叫方式
| 助理 | 呼叫 |
|---|---|
| Claude Code / Antigravity | /jsc:code-review-nuget,或 /jsc:code-review-nuget MySolution.sln --include-prerelease |
| Codex | $code-review-nuget,或 $code-review-nuget src/App/App.csproj --build "dotnet build App.sln -c Release" |
| OpenCode | 描述需求(如「把這個 .NET solution 的 NuGet 都更新到最新,先清掉 ProjectReference 已提供的重複套件,每更新一包就 build」)自動觸發 |