5.【.NET10 实战--孢子记账--产品智能化】--基础框架与微软官方包批量升级

从这篇文章开始,我们将正式对整个项目展开升级工作,目标是将项目从 .NET 8 迁移到 .NET 10。在整个升级过程中,我们的关注重点并不在于新版本带来了哪些令人眼前一亮的特性,毕竟新特性的介绍在前面的章节中已经有所涉及。我们真正想要探讨的,是在实际升级过程中会遇到哪些具体的问题,这些问题背后的原因是什么,以及我们应该采用怎样的思路和方法去逐一解决它们。这种以问题为导向的升级视角,往往比单纯的特性介绍更具实践价值,也更贴近真实项目的工程经验。

既然升级涉及的范围较广,我们就需要有一个合理的切入点。升级一个大型项目时,贸然从业务逻辑层面入手往往会带来大量不可预期的连锁问题,因此更稳妥的做法是从底层基础设施开始,逐层向上推进。基于这一思路,我们选择以基础框架和微软官方包的批量升级作为整个升级旅程的起点。这部分内容相对独立,升级路径也较为清晰,是整个升级工作中风险最低、最适合优先处理的环节,非常适合作为后续更复杂升级工作的热身与铺垫。

值得一提的是,基础框架和官方包的批量升级,本质上是一项规律性强、重复度高的机械性工作------修改目标框架版本、替换镜像标签、清理内置包引用,这些操作在十几个项目中来回重复。既然本书的主题是产品智能化,我们不妨从这里就开始实践这一理念,将这部分升级任务直接交给 AI 来完成。我们只需将升级的目标和约束条件清晰地描述给 AI,由它来逐项执行具体的改动。这样做不仅能大幅提升效率,也能让我们从枯燥的体力劳动中解放出来,把注意力集中在后续更需要人工判断和业务理解的升级环节上。

Tip:本转来使用的AI工具是 VS Code 的 Copilot 插件,当然你也可以选择其他的 AI 工具来完成这部分工作。无论使用哪种工具,关键在于我们要学会如何有效地与 AI 进行沟通,明确地表达我们的需求和预期,这样才能让 AI 更好地为我们服务。

一、基础框架升级

基础框架的升级主要涉及10个微服务项目的.csproj文件的修改,10个 Dockerfile 文件的修改,以及一些基础设施相关配置文件的调整。

我们将这个任务列表直接交给 AI,让它逐项执行修改,并告诉AI每执行一项修在对应的任务前打一个勾,在全部修改完成时再进行一次整体的检查,确保没有遗漏任何修改项。以下是我们给 AI 的指令,如果你有更好的指令也可以使用:

markdown 复制代码
按照以下任务列表逐项修改项目文件,完成每项修改后在对应的任务前打一个勾,全部任务完成后进行一次确认:
- [ ] 将所有 `.csproj` 中 `<TargetFramework>net8.0</TargetFramework>` 改为 `net10.0`(10 个服务可并行修改)
- [ ] 更新所有 `Dockerfile` 基础镜像:
  - `mcr.microsoft.com/dotnet/sdk:8.0` → `mcr.microsoft.com/dotnet/sdk:10.0`
  - `mcr.microsoft.com/dotnet/aspnet:8.0` → `mcr.microsoft.com/dotnet/aspnet:10.0`
- [ ] 移除 `SP.Common/SP.Common.csproj` 中严重过时的 `Microsoft.AspNetCore.Http.Abstractions 2.2.0`(2018 年 ASP.NET Core 2.2 遗留包,.NET 10 框架已内置)
- [ ] 从各服务 `.csproj` 中移除以下在 `net10.0` 框架内已内置的包:
  - `System.Text.Json`(出现在 SP.Common 等多个服务)
  - `System.Text.Encodings.Web`(出现在 IdentityService、FinanceService、ConfigService、NotificationService、ReportService 服务中)
  - `System.Text.Encodings.Web`(出现在 IdentityService、FinanceService、ConfigService、NotificationService、ReportService 服务中)

AI 收到指令后会先阅读要求,理解每项任务的具体内容和修改范围,然后阅读需要修改的文件,找到对应的内容进行修改,并在完成后在任务前打勾。整个过程中,AI 会保持对任务列表的跟踪,确保每项任务都被正确执行,并在最后进行一次整体检查,确认所有修改都已完成且没有遗漏。以下截图展示了 AI 在执行这些任务时的界面和操作过程:

从图中可以看到,AI 已经成功地将所有 .csproj 文件中的目标框架版本从 net8.0 修改为 net10.0,并且更新了所有 Dockerfile 中的基础镜像标签。同时,AI 还移除了过时的包引用,并清理了内置包的冗余引用。

接着,我们对整个修改结果进行了检查,并编译项目,确认所有任务都已完成且没有遗漏任何修改项,也没有引入新的编译错误。最后将修改的文件提交到版本控制系统中,完成了基础框架升级的第一阶段工作。

Tip:如果修改的并不符合预期或者编译错误,可以让 AI 进行回滚并重新执行修改,直到达到预期的结果为止。

二、微软官方包批量升级

和基础框架升级类似,微软官方包的批量升级也是一项规律性强、重复度高的机械性工作,适合交给 AI 来完成。我们同样将这部分升级任务直接交给 AI 来执行,但这次我们让 AI 在完成修改后自行编译,以下是我们给 AI 的指令:

markdown 复制代码
以下是涉及到的包和服务的表格:

| 包名 | 当前版本 | 目标版本 | 涉及服务数 |
|------|---------|---------|----------|
| `Microsoft.EntityFrameworkCore.*`(所有子包) | 8.0.8 | 10.0.x | 8 个 |
| `Microsoft.AspNetCore.Identity.EntityFrameworkCore` | 8.0.8 | 10.0.x | 6 个 |
| `Microsoft.AspNetCore.Authentication.JwtBearer` | 8.0.8 | 10.0.x | ConfigService、IdentityService |
| `Microsoft.Extensions.*`(所有 Abstractions) | 8.0.x | 10.0.x | SP.Common |
| `System.Formats.Asn1` | 8.0.1 | 10.0.x 或移除 | SP.Gateway |
| `Microsoft.VisualStudio.Web.CodeGeneration.Design` | 8.0.7 | 10.0.x | 6 个(开发工具) |
| `Microsoft.Build` | 17.8.43 | 对齐 SDK 版本 | 6 个(开发工具) |

根据上述表格和以下任务列表逐项修改项目文件,完成每项修改后在对应的任务前打一个勾,全部任务完成后进行一次确认,并对项目进行编译:

- [ ] 批量执行包版本升级
 - [ ] `Microsoft.EntityFrameworkCore.*`(所有子包)
 - [ ] `Microsoft.AspNetCore.Identity.EntityFrameworkCore`
 - [ ] `Microsoft.AspNetCore.Authentication.JwtBearer`
 - [ ] `Microsoft.Extensions.*`(所有 Abstractions)
 - [ ] `System.Formats.Asn1`(升级到支持 .NET 10 的版本,或根据 .NET 10 的更新情况考虑移除)
 - [ ] `Microsoft.VisualStudio.Web.CodeGeneration.Design`(升级到支持 .NET 10 的版本)
 - [ ] `Microsoft.Build`(升级到与 .NET 10 SDK 版本对齐的版本)

AI 收到指令后会先阅读要求,理解每项任务的具体内容和修改范围,然后阅读需要修改的文件,找到对应的包引用进行修改,并在完成后在任务前打勾,最后进行编译代码,检查是否存在编译错误。以下截图展示了 AI 在执行这些任务时的界面和操作过程:

在上图中,我们看到 AI 回去查找适合 .NET 10 的稳定的包,这个过程是通过 dotnet package search 命令来完成的。同样我们看到 AI 也去 nuget 官网查询了 pomelo.entityframeworkcore.mysql.9.0.0.json 这个文件,这个文件是 NuGet 包的元数据文件,里面包含了包的版本信息、依赖关系等重要信息。通过查询这个文件,AI 能够确认 Pomelo.EntityFrameworkCore.MySql 包是否已经发布了支持 .NET 10 的版本,以及该版本的具体信息。在执行完读取元数据文件后,AI 又执行了 $packageName 命令和 $resp 命令,这两个命令都是通过 NuGet 官方 API 查询组件包的版本信息。经过这些查询,AI 发现 Pomelo 的最新版 9.0.0 对 EFCore 的依赖范围是 [9.0.0, 9.0.999],这与 EFCore 10.x 硬性不兼容,如果将 EFCore 升到 10.0.5 会导致所有使用 Pomelo 的服务包解析失败。因此它执行了回退兜底方案, EFCore 升到 9.0.14,同时升 Pomelo 到 9.0.0,并在编译时它会确认这个方案是否可行。

在编译阶段,我们看到控制台输出了报错信息,AI 根据报错信息去排查问题,发现是 VisualStudio.Web.CodeGeneration.Design 的依赖 EFCore.Design,与 Pomelo 存在冲突。接着 AI 又去查询了 nuget 中相关包的元数据信息,并根据查到的结果修改我们项目中包的引用,最后再次编译检查,确认所有包版本都已成功升级且没有引入新的编译错误。

三、总结

我们通过 AI 的帮助,成功地完成了基础框架和微软官方包的批量升级工作。这些升级任务虽然相对机械,但却是整个升级过程中不可或缺的基础环节。通过将这些任务交给 AI 来执行,我们不仅大幅提升了效率,还能够更专注于后续更复杂的升级工作。

相关推荐
howlet22 小时前
AI生成cocos-creator打砖块游戏-准备工作
人工智能·游戏
GlobalInfo2 小时前
全球与中国通用快速连接器(Universal Quick Connector) 市场报告:2026 年布局实战指南
大数据·人工智能·物联网
ZPC82102 小时前
相机接入ROS2 流程及问题排查
人工智能·算法·机器人
Flittly2 小时前
【SpringAIAlibaba新手村系列】(12)RAG 检索增强生成技术
java·人工智能·spring boot·spring·ai
羊小猪~~2 小时前
LLM--大模型快速展示(Gradio)
人工智能·python·大模型·llm·部署·gradio·ai算法
猪腰子正2 小时前
机器学习实践-01数据准备流程
人工智能·机器学习
美团技术团队2 小时前
LongCat-Flash-Prover:AI 攻克数学定理证明,不仅要“算得对”,更要“证得严”
人工智能
葡萄城技术团队2 小时前
Claude Code Buddy 小析:一个非核心功能,如何体现产品的细节完成度
android·java·microsoft
2301_764441332 小时前
2026年GitHub中比较热门的skills技能
人工智能·自然语言处理·开源·github