交互式NuGet包升级工具Skill upgrade-nuget-packages

这是一个用于 .NET 开发的交互式 NuGet 包升级技能,能够自动检测包漏洞、警告版本升级中的破坏性变更,支持模拟运行和自动化升级,提升项目安全性和维护效率。关键词:NuGet 包升级、漏洞检测、破坏性变更、.NET 开发、DevOps 工具。

DevOps 0 次安装 0 次浏览 更新于 3/11/2026

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:

  1. 检查 <ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
  2. 如果找到,修改 Directory.Packages.props 而不是单独的 .csproj 文件
  3. 报告哪个文件被修改

示例

# 显示并交互式升级过时的包
/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