GitHub Copilot现代化使用结构化方法来升级和迁移.NET项目。 了解代理的工作原理(包括其方案、技能、任务和工作流)可帮助你有效地与代理协作并获得最佳结果。
小窍门
将代理视为一位熟练的同事,他们深刻理解.NET,遵循结构化计划,并适应你的反馈。 你提供越多的上下文,代理的性能就越好。
代理人作为队友
代理擅长协作,而不是在真空中实现自动化:
- 深厚的 .NET 知识: 代理了解项目文件、NuGet 包依赖项、重大的变更和迁移模式,并且掌握这些技术在数十种 .NET 技术中如何应用于 C# 和 Visual Basic 项目。
- 结构化工作流: 每个升级都经过评估、规划和执行。 没有随机变化,没有惊喜。
-
了解首选项: 当你说“始终使用显式类型而不是
var”时,代理会写入scenario-instructions.md该首选项并在会话之间记住它。 - 可更正的中途: 打错了电话? 告诉代理。 它会适应并应用未来的更正。
- 解释其推理: 问 “你为什么选择这种方法?” ,代理会引导你完成决策。
场景
场景是托管的端到端现代化流程。 当你告诉代理“将我的解决方案升级到 .NET 10”时,将触发 .NET version upgrade 方案。
如何发现场景
无需记住情境名称。 代理会自动发现相关方案:
- 分析代码库,了解所使用的技术,包括语言、框架版本、库和项目类型。
- 识别出与项目相关的场景。
- 按重要性和权重对方案进行排名。 最相关的优先显示。
还可以直接询问: “我的解决方案有哪些方案可用?
方案持久性
每个活动方案都会分配一个自己的文件夹.github/upgrades/{scenarioId}/。 方案文件夹包含计划、任务进度、首选项和执行日志。 该文件夹是 Git 存储库的一部分。
有关方案的完整列表,请参阅 方案和技能参考。
工作流生命周期
每个方案都遵循相同的生命周期:一个三阶段工作流。
阶段 1:评估
代理在开始工作之前收集所需的一切:
- 目标框架: 要升级到的版本。
- Git 策略: 代理建议分支策略,而详细信息则由您控制:分支名称、是否使用按任务分支以及提交时间。
- 流模式: 自动(代理驱动器)或引导式(你批准每个阶段)。
- 特定于方案的参数: 根据方案,代理可能会提出更多问题。
代理在.github/upgrades/{scenarioId}/初始化场景工作区。
然后,代理分析代码库:
- 项目依赖关系图(拓扑顺序)
- NuGet 包与目标框架的兼容性
- 重大 API 更改
- 测试覆盖范围
- 复杂性和风险因素
代理将综合评估报告保存到 assessment.md。
根据评估,代理会评估解决方案,并确定哪些升级决策是相关的。 它提供合理的默认值,并允许你查看和替代任何选择。
选项可能包括:
- 升级策略: 从下到上、从上到下或一次性。
- 项目迁移方法:就地重写或并行部署 Web 应用程序;就地或多目标适用库。
- 技术现代化: 实体框架迁移、依赖项注入、日志记录和配置的选项。
- 包管理: 是否和何时采用中央包管理。
- 兼容性处理: 如何解决不支持的 API 和包。
代理将确认的决定保存到 upgrade-options.md。
在 引导模式下,代理将在此处暂停以供审阅,然后再继续操作。
阶段 2:规划
代理根据评估和确认的选项创建任务计划。 规划生成三个关键文件:
-
plan.md:具有策略和任务说明的升级计划。 -
scenario-instructions.md:您的偏好、决策和代理的记忆。 -
tasks.md— 代理将执行的任务的有序列表。
阶段 3:执行
代理按顺序处理任务。 对于每个任务 tasks.md,代理遵循一个周期:启动、执行、验证(生成和测试),然后完成。 可以控制代理提交更改的时间和方式:每个任务、每个任务组或最终。 代理正常工作时,它会使用实时状态指示器进行更新 tasks.md ,以便跟踪进度。
升级策略
在评估阶段,代理会评估解决方案,并建议以下策略之一:
| 策略 | 最适用于 | 工作原理 |
|---|---|---|
| 自下而上 | 具有深度依赖项关系图的大型解决方案 | 从叶项目(无依赖项)开始,向上工作。 |
| 从上到下 | 关于主应用程序的快速反馈 | 从应用程序项目开始,根据需要修复依赖项。 |
| 全部一次 | 小型简单解决方案 | 一次性升级一切。 |
小窍门
代理程序仅显示与您的项目相关的决策内容。 简单的控制台应用看不到 Web 框架选项,没有 Entity Framework 的项目看不到数据库迁移选项。
技能
技能 是细化的现代化能力。 当代理在升级过程中遇到 EF6 代码时,它会加载 EF6 到EF-Core 技能,其中包含详细的分步迁移说明。 在升级过程中直接调用技能: “将项目中的 WCF 服务迁移到 CoreWCF。
代理附带了由域组织的 30 多种内置技能:
- 数据访问: EF6 到 EF Core(代码优先和 EDMX)、LINQ to SQL 和 SqlClient 迁移
- Web/ASP.NET: Identity、Global.asax、OWIN、MVC 路由/筛选器/捆绑和 WCF 到 CoreWCF
- 序列 化: Newtonsoft.Json 到 System.Text.Json
- Cloud: Azure Functions内置到隔离的工作者模型
- 库: ADAL 到 MSAL、SignalR、PowerShell SDK 等
技能会基于代理检测到的代码库内容自动加载。 无需管理技能加载。 只需描述所需的内容。
有关完整列表,请参阅 方案与技能参考。
任务
任务 是方案中的原子工作单元。 每个任务表示一个特定的有限升级部分,例如“将 CommonLib 从 .NET 6 升级到 .NET 10”或“将 DataLayer 中的 EF6 使用情况迁移到 EF Core”。
任务生命周期
任务在以下状态中移动:
- 可用: 准备好启动,满足所有依赖项。
- 正在进行中: 代理正在积极处理任务。
- 完成: 应用的代码更改、构建通过、测试通过。
对于每个任务,代理:
- 加载相关技能和上下文信息。
- 评估复杂性,并确定任务是否需要子任务。
- 将范围摘要写入
tasks/{taskId}/task.md。 - 执行代码更改。
- 通过运行构建和测试来验证。
- 在
tasks/{taskId}/progress-details.md中记录结果。 - 提交更改并移动到下一个任务。
状态管理
代理保持持久性状态,以便随时停止和恢复。 所有内容都位于您的存储库内.github/upgrades/{scenarioId}/。
| File | Purpose |
|---|---|
scenario-instructions.md |
你的首选项、决策和自定义说明。 代理的持久性内存。 |
upgrade-options.md |
确认的升级决策 |
plan.md |
具有策略和任务说明的升级计划 |
tasks.md |
显示任务状态的视觉进度仪表板 |
execution-log.md |
所有更改和决策的详细日志 |
tasks/{taskId}/task.md |
每个任务的范围和上下文 |
tasks/{taskId}/progress-details.md |
按任务执行说明和结果 |
可恢复性
关闭聊天、关闭 IDE 或第二天返回。 代理会从中断的地方继续:
- 在下一次交互中,代理会自动检查工作区的当前状态。
- 代理会检测现有方案并显示当前进度,例如“已完成的 8 个任务中的 3 个”。
- 代理会检测到陈旧的任务(因以前中断的会话而停滞不前),并提供选项以恢复或重启这些任务。
- 代理从
scenario-instructions.md中重新加载首选项。
跨 IDE 连续性
由于状态位于 Git 中,因此可以在 VS Code、Visual Studio 和 Copilot CLI 中间升级之间切换。 文件夹 .github/upgrades/ 是两个 IDE 都理解的共享状态。
小窍门
将 .github/upgrades/ 文件夹提交到分支。 将分支推送到远程存储库,让团队成员查看进度或继续在不同计算机上升级。
流模式
代理支持两种流模式,用于控制你拥有多少监督: 自动模式 和 引导模式。
自动模式
代理会完成所有阶段(评估、规划和执行),而无需暂停审批。 它呈现了关键发现和进度更新,同时不断前进。
最适合经验丰富的用户、直接升级和小型解决方案。
引导模式
代理在每个阶段节点暂停,供您审核。
- 评估后: “这是我找到的。是否继续执行升级选项?
- 规划后: “任务计划如下。你希望我开始执行吗?
- 在复杂任务分解之前: “此任务很复杂。下面介绍了我会如何分解它。
最适合初次使用者、复杂的解决方案,以及想要学习这一过程的情况。
随时切换模式
- 说 出“暂停” 或 “切换到引导” ,以切换到引导模式。
- 假设 “继续” 或 “继续”切换到自动 模式。
小窍门
从引导式模式开始,以便第一次升级以了解工作流,然后在舒适后切换到“自动”。