通过


为 .NET 升级应用自定义升级指令

自定义升级说明是 Markdown 文件,用于指导 GitHub Copilot 的现代化改造,以便在升级期间应用特定转换。 创建这些文件以自动执行重复更改,例如将一个库替换为另一个库或应用特定的 API 升级。

本文介绍如何创建和构建自定义升级指令文件、隔离测试它并将其集成到升级工作流的评估阶段。

先决条件

在创建自定义说明之前,请在开发环境中配置 GitHub Copilot 的现代化功能。 有关安装步骤,请参阅 Install GitHub Copilot modernization

了解自定义升级说明

GitHub Copilot 在升级的评估和规划阶段会按需以 Markdown 文件格式检索自定义升级说明。 自定义升级说明不同于 copilot-instructions.md 因为它们是:

  • 目标是自动化代码和依赖项的变更。
  • 仅当与当前升级评估或计划相关时才检索。
  • 复制到每个存储库时,可跨解决方案重复使用。

使用以下方法构建说明文件:

  • 描述行动的简短标题。 例如,“将 Newtonsoft.Json 替换为 System.Text.Json”。
  • 简洁的问题语句或先决条件部分。
  • 显式步骤逻辑(“如果找到 X,请执行 Y” )。 避免模糊的语言。
  • (推荐)从实际本地编辑中捕获的一个或多个差异示例,用于指导转换。

除了定制升级说明,还可以利用标准技能和说明系统推进GitHub Copilot的现代化。 技能为代理添加能力,说明文件(如 copilot-instructions.md)提供全局指导。

创建自定义升级说明

按照以下步骤生成和优化新的指令文件。 这些部分重点是将Newtonsoft.Json替换为System.Text.Json,作为一个示例。

  1. 解决方案资源管理器 窗口中,右键单击 solution>Modernize

    -或-

    打开Copilot聊天面板并键入 @Modernize 以启动与代理的对话。

    注释

    这些步骤适用于Visual Studio。 在Visual Studio Code和其他环境中,直接从Copilot聊天面板调用 modernize-dotnet 代理。 在Visual Studio中,代理命名为 Modernize

  2. 在聊天中,键入: I want to generate a custom upgrade instruction.

  3. 在询问时,请您提供一个情景,例如I want to replace Newtonsoft with System.Text.Json,以便由Copilot创建文件。

  4. 当Copilot创建新文件(如 replace_newtonsoft_with_system_text_json.md),查看内容并在聊天中对其进行优化。 例如,要求Copilot“阐明检测条件”“添加先决条件节”。“

    小窍门

    将文件添加到解决方案中,以便查看(如果尚未包含)。

  5. 使用真正的差异示例加强指令。

    1. 在一个项目中手动更改所需的代码。 例如,“删除 Newtonsoft.Json 包,使用指令更新,并将代码替换为 JsonConvertJsonSerializer.”
    2. 在聊天中,打开指令文件时,键入: Check my git changes and add diffs as examples to my instruction file
    3. 确认 Copilot 使用了 git diff 并将一个围栏式 diff 块或结构化示例附加到了 Markdown 文件中。

创作提示

按照以下准则编写清晰有效的自定义升级说明,Copilot可以可靠地解释:

  • 使用明确的条件措辞: If code references X, then do Y.
  • 为每个文件保留一个转换;当多个文件必须按顺序运行时,请使用先决条件。
  • 提供至少一个具体示例,例如差异或前后代码段,以提高转换准确性。
  • 避免使用像“改进”或“修复”这样不明确的动词;应使用明确的操作,例如“替换”、“删除”和“更新”。

测试自定义升级指令(一次性运行)

在升级期间运行指令之前,请隔离验证它。 独立测试有助于优化检测并验证代码更改。

  1. 解决方案资源管理器 窗口中,右键单击 solution>Modernize

    注释

    这些步骤适用于Visual Studio。 在Visual Studio Code和其他环境中,直接从Copilot聊天面板调用 modernize-dotnet 代理。

  2. 在聊天中,使用类似于文件名的措辞调用指令。 例如,replace Newtonsoft with System.Text.Json

  3. 在聊天窗口中确认Copilot检索了指令文件:

    > Getting instructions for 'replace Newtonsoft with System.Text.Json'.
    
    Perfect! I've retrieved the scenario instructions for upgrading from Newtonsoft.Json to System.Text.Json. Now I'll begin the analysis following the scenario-specific instructions.
    

    如果Copilot未指示它找到指令,请使用文件名中的关键字重试,例如相同的谓词和名词组合。

  4. 查看建议的更改(解决方案差异、待提交的更改或预览的修改),以确认自定义升级指令的行为符合预期。

验证提示

如果测试运行未生成预期结果,请使用以下故障排除提示来优化说明文件:

  • 如果Copilot仅更新包版本,而不是替换包,请确保明确说明删除或替换旧包。
  • 请保持一致的命名,以便自然语言激活功能能够匹配。 例如,以 replace_ 开始文件名,并以“替换...”开始聊天请求。
  • 在测试期间,添加任何缺失的代码模式作为示例以提高覆盖率。

在升级期间应用自定义说明

使用以下步骤将现有自定义升级指令合并到升级的评估阶段。

  1. 解决方案资源管理器 窗口中,右键单击 solution>Modernize

    注释

    这些步骤适用于Visual Studio。 在Visual Studio Code和其他环境中,直接从Copilot聊天面板调用 modernize-dotnet 代理。

  2. 在聊天中,选择 Upgrade to a newer version of .NET。 在它开始评估之前,请回答Copilot的问题。

  3. 监视聊天,以查看在评估期间Copilot是否自动检索自定义指令文件。 查找一条消息,该消息表明它已打开 Markdown 指令文件。

    如果 Copilot 不会自动应用自定义指令,请明确请求它们。 使用类似于文件名的措辞。 例如,use the custom instructions to replace Newtonsoft with System.Text.Json during the assessment

  4. 等待Copilot确认它检索到 Markdown 文件。 如果未看到对指令文件的引用,请使用文件的键谓词(替换、更新、删除)和包名称重新编写请求。

  5. 查看 assessment.md 文件夹中生成的 .github/upgrades 文件。 确认评估包括自定义指令识别的问题和更改。

    例如,替换 Newtonsoft 时,评估结果显示:

    • 使用 Newtonsoft.Json 包的项目。
    • 需要为 System.Text.Json 进行重构的代码模式。
    • 要删除或替换的依赖项。
  6. 如果需要,请编辑 assessment.md 文件以添加上下文,或在继续之前调整识别的问题。

  7. 告知Copilot,当评估反映出自定义指令后,继续进入规划阶段。

  8. 查看Copilot生成的 plan.md 文件。 此文件包含用于解决评估中问题的策略。

  9. 通过指示 Copilot 继续,进入执行阶段。 在 Copilot 应用转换时监视 tasks.md 文件。

更好的激活建议

如何命名和调用自定义升级说明会影响 Copilot 是否会自动检索它们。 遵循以下准则提高激活可靠性:

  • 匹配文件的谓词。 如果文件名使用 replace,请使用该措辞(不是 upgradefix)。
  • 为每个文件保留一个转换,以便清晰和重复使用。 通过列出每个文件中的先决条件对多个文件进行排序。
  • 在评估阶段请求自定义说明以获取最佳结果,而不是在计划或执行之前等待。
  • 避免出现模棱两可的请求,例如“改进评估”。 明确:“在评估期间应用‘replace_newtonsoft_with_system_text_json’说明。”

验证已实施的更改

升级完成后:

  1. tasks.md中查看.github/upgrades文件,以了解与自定义指令相关的任务状态。
  2. 检查在执行阶段创建的 Git 提交,以识别与自定义指令相关的更改。
  3. 运行测试以确保功能行为保持正确。
  4. 可选:从成功的更改中捕获差异示例,并将其添加到指令文件中,以增强未来的自动化。

清理资源

删除或合并任何临时指令文件,以避免将来升级中出现重叠转换。