name: upgrade-nuget-packages description: 交互式 NuGet 包升级,带漏洞检测和破坏性变更警告 argument-hint: “[–vulnerable] [–major] [–dry-run] [–auto] [–project <名称>]” allowed-tools: Bash, Read, Edit, Glob, Grep, AskUserQuestion, mcp__perplexity__search
/dotnet:upgrade-nuget-packages
交互式 NuGet 包升级命令,具有漏洞、破坏性变更和兼容性智能分析。
参数
从 $ARGUMENTS 解析参数:
| 标志 | 描述 | 默认值 |
|---|---|---|
--outdated |
仅显示过时的包 | true |
--vulnerable |
仅显示已知 CVE 的包 | false |
--major |
包括主版本升级 | false |
--preview |
包括预览/预发布版本 | false |
--dry-run |
显示将更改的内容而不应用 | false |
--project <路径> |
目标特定项目(模糊匹配) | 所有项目 |
--interactive |
对每个升级决策使用 AskUserQuestion | true |
--auto |
无提示升级所有(与 --interactive 相反) | false |
工作流程
步骤 1: 收集包信息
运行适当的 dotnet 命令:
# 对于过时的包
dotnet list package --outdated [--include-prerelease]
# 对于有漏洞的包
dotnet list package --vulnerable
# 对于特定项目
dotnet list "<项目>" package --outdated
解析输出以提取:
- 项目名称
- 包名称
- 当前版本(请求的)
- 解析版本
- 最新可用版本
步骤 2: 分析升级
对每个过时的包进行分类:
版本变更类型:
- 补丁 (1.0.0 -> 1.0.1): 错误修复,可安全自动升级
- 次要 (1.0.0 -> 1.1.0): 新功能,向后兼容
- 主要 (1.0.0 -> 2.0.0): 可能有破坏性变更
风险评估:
- 检查包是否有已知的破坏性变更(对主要版本使用 perplexity)
- 检查包是否已弃用
- 检查新版本是否支持当前 TFM
步骤 3: 呈现升级
按项目分组并呈现摘要:
可用的包升级
项目: src/MyApp/MyApp.csproj
包名 当前版本 最新版本 变更类型
Newtonsoft.Json 13.0.1 13.0.3 补丁
Microsoft.Extensions.DI 8.0.0 10.0.0 主要 (!)
Serilog 3.1.0 4.0.0 主要 (!)
项目: tests/MyApp.Tests/MyApp.Tests.csproj
包名 当前版本 最新版本 变更类型
xunit 2.6.0 2.9.0 次要
Moq 4.18.0 4.20.0 次要
图例: (!) = 主版本,可能有破坏性变更
步骤 4: 交互式升级(如果 --interactive)
对每个包(或组),使用 AskUserQuestion:
对于补丁/次要版本:
将 Newtonsoft.Json 从 13.0.1 升级到 13.0.3(补丁)?
选项:
- 是,升级
- 跳过此包
- 自动升级所有补丁
对于主要版本: 首先,研究破坏性变更:
使用 mcp__perplexity__search:
查询: "<包名> <旧版本> 到 <新版本> 破坏性变更 迁移"
然后呈现上下文:
将 Microsoft.Extensions.DependencyInjection 从 8.0.0 升级到 10.0.0?
发现的破坏性变更:
- IServiceCollection.AddXxx 方法现在返回 IServiceCollection
- 一些过时的 API 已移除
选项:
- 是,升级(需要代码更改)
- 跳过此包
- 显示更多详情
步骤 5: 应用升级
对每个批准的升级:
如果使用中央包管理 (Directory.Packages.props):
# 在 Directory.Packages.props 中更新版本
# 使用 Edit 工具修改文件
如果使用每项目引用:
dotnet add <项目> package <包名> --version <版本>
步骤 6: 验证
所有升级后:
dotnet restore
dotnet build
如果构建失败:
- 报告哪些包可能引起问题
- 建议运行
/dotnet:build --fix以自动解决
输出格式
模拟运行:
[模拟运行] 将升级以下包:
项目: src/MyApp/MyApp.csproj
Newtonsoft.Json: 13.0.1 -> 13.0.3 (补丁)
Serilog: 3.1.0 -> 4.0.0 (主要)
项目: tests/MyApp.Tests/MyApp.Tests.csproj
xunit: 2.6.0 -> 2.9.0 (次要)
总计: 2 个项目中的 3 个包
运行时不带 --dry-run 以应用升级。
升级后:
包升级完成
已升级:
- Newtonsoft.Json: 13.0.1 -> 13.0.3
- Serilog: 3.1.0 -> 4.0.0
- xunit: 2.6.0 -> 2.9.0
已跳过:
- Microsoft.Extensions.DI(用户跳过)
验证:
- dotnet restore: 成功
- dotnet build: 成功
所有包升级成功。
有构建错误时:
包升级完成(有 issues)
已升级:
- Serilog: 3.1.0 -> 4.0.0
检测到构建错误:
CS0619: 'Log.Logger' 在 Serilog 4.0 中已过时
推荐:
1. 运行 /dotnet:build --fix 以尝试自动解决
2. 或使用以下命令还原:dotnet add package Serilog --version 3.1.0
漏洞模式
当指定 --vulnerable 时:
dotnet list package --vulnerable
输出专注于安全:
发现的有漏洞包
严重:
- System.Text.Json 6.0.0 - CVE-2024-XXXXX (RCE)
修复版本: 6.0.10, 8.0.5
高:
- Newtonsoft.Json 12.0.0 - CVE-2024-YYYYY (DoS)
修复版本: 13.0.1
推荐:立即升级有漏洞的包。
继续升级? [Y/n]
中央包管理支持
检测并尊重 Directory.Packages.props:
- 检查
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally> - 如果找到,修改 Directory.Packages.props 而不是单独的 .csproj 文件
- 报告哪个文件被修改
示例
# 显示并交互式升级过时的包
/dotnet:upgrade-nuget-packages
# 仅显示有漏洞的包
/dotnet:upgrade-nuget-packages --vulnerable
# 包括主版本升级
/dotnet:upgrade-nuget-packages --major
# 预览而不应用
/dotnet:upgrade-nuget-packages --dry-run
# 无提示升级所有
/dotnet:upgrade-nuget-packages --auto
# 升级特定项目
/dotnet:upgrade-nuget-packages --project MyApp.Api