
AWS 发布基于 Kiro 的 PHP 转 Java 迁移引擎,以技能文件封装迁移方法
来源标题:Build a repeatable PHP-to-Java migration engine with Kiro
AWS 推出一个开源的 PHP 到 Java 迁移引擎,将迁移方法封装为版本化的 Markdown 技能文件,用户可自行运行。该引擎支持两种用法:在 Kiro 编辑器中由 AI 代理按八阶段流程逐步执行迁移,每阶段设审批环节;也可通过 AWS Transform 调用同一套技能文件进行大规模迁移。引擎还包含一个发现扫描工作流 php-model-discovery。
以下正文由 AI 翻译自 Hacker News 最新(原文版权归原站所有),可能存在偏差,重要内容请以原文为准。
先从一个开放的代码仓库入手,这样你可以亲自运行这个引擎,而不是只停留在阅读介绍上。引擎所掌握的一切都存放在一小组 skill 文件里,借助这些文件,你可以用不止一种方式运行同一套方法论。
这里的所有内容都打包为 skill 文件:即带版本控制的 Markdown 能力包,它们编码了迁移方法论(php-to-java-migration)和发现扫描器工作流(php-model-discovery)。由于这些知识存在于文件中而非某个特定工具里,你可以用两种方式运行同一套方法论。
Kiro 将 AI agent 带入你的编辑器,逐步驱动迁移。把仓库根目录作为 Kiro 工作区打开,当你要求 Kiro 迁移一个 PHP 应用时,这些 skill 会自动激活。随后 Kiro 会按照八个阶段的工作流推进,并设有明确的审批关卡,因此你可以审查发现清单、批准规则手册,并在每个阶段开始前签字确认。本文中的所有示例都采用这一模式。
AWS Transform 是 AWS 用于大规模迁移和现代化的 agentic AI 服务,它现已与 Kiro 原生集成。通过这一集成,你可以把管理交互式 Kiro 会话的同一批 skill 文件交给 AWS Transform,于是“先发现后翻译”、以 parity harness 作为裁判,以及“修循环,不修代码”这些原则同样适用于自主运行。
这个引擎围绕一个原则组织:一个共享大脑,多个项目。要打开它,先在本地克隆仓库,然后在 Kiro 中打开一个文件夹并选择仓库根目录(即包含 .kiro/ 的文件夹)。Kiro 会自动加载 skill 和 steering,更详细的步骤见“Getting started”。
工作区将共享的方法论层与使用它的各个项目分开,如下图所示。顶层是全局的 .kiro/ 层,每个项目都从中受益。其下是各项目文件夹,每个都有自己的 PHP 源码、Java 输出和规范子文件夹。
图 1:工作区分为共享的全局方法论层,以及各项目的代码和规范文件夹
同一批共享 skill 文件可以用两种不同方式运行,如下图所示。完全相同的八阶段、parity 优先的流水线,既可以由 Kiro 驱动(交互式,一次一个应用),也可以由 AWS Transform 驱动(agentic,组合规模),两者都会把 PHP 源码转换为经 parity 验证的 Spring Boot Java。
图 2:同一批共享 skill 文件驱动两条执行路径:Kiro(交互式,一次一个应用)和 AWS Transform(agentic,组合规模)。两者都运行完全相同的八阶段 parity 优先流水线,把 PHP 源码转换为经 parity 验证的 Spring Boot Java
.kiro/ 下的共享全局层包含两个 Skill——php-model-discovery(扫描器)和 php-to-java-migration(八阶段操作手册),以及 core-workflow.md 这个 Steering 文件。每个项目文件夹都在 .kiro/specs/ 下有自己的 PHP 源码、Java 输出和规范子文件夹,因此改进一次方法论,每个项目都能继承这一收益。
最重要的规则先于一切生效:在扫描器运行之前,不要读取、猜测或手工翻译任何 model 或 entity 文件。
扫描器单遍运行、无依赖,如下图所示。它对源 token 应用三种发现策略,输出一份 JSON 清单,任何有歧义的内容都会被送入 review-flag 队列,由人工解决。
图 3:扫描器对源 token 运行三种发现策略,输出一份带 review-flag 队列的 JSON 清单
扫描器是 discover-models.php,一个单文件、无依赖的 PHP 命令行工具,它不执行目标代码。它只把源文本作为 token 读取,因此无论目标应用的依赖是否安装,都能对其运行。每次扫描它都会运行三种策略:Eloquent model 发现(沿类继承链追溯到 Illuminate\Database\Eloquent\Model)、Doctrine attribute 检测(#[ORM\Entity] attribute)以及 ORM XML 映射(外部 *.orm.xml 文件)。输出是一份 JSON 清单。models[] 数组承载每个字段、cast、关系和可见性规则,每个条目上都有一个 flags[] 数组。扫描器会标记歧义而不是猜测。例如,由运行时表达式构建的 $fillable 列表会变成一个用自然语言表述的 flag,而这个 flag 列表就是人工审查队列。
Phase 0 是准备阶段:它运行扫描器并汇总清单。接下来的三个阶段集中投入人的专业知识。Phase 1 在编写 Java 之前构建 parity harness,对 PHP 原版和 Java 移植版重放请求/响应对。这个 harness 必须在可正常工作的 PHP 上通过,并且在你故意破坏它时失败,因为一个漏掉人为注入破坏的 harness 是不可信的。Phase 2 播下规则手册和差距清单(RULEBOOK.md、GAP_INVENTORY.md),Phase 3 在将其推广到整个应用之前,用有代表性的文件对它进行压力测试。
图 4:人的判断被前置到准备性的 Phase 0 和 Phase 1–3。Phase 4–8 主要是自行驱动的循环,由 parity harness 担任裁判
前四个阶段集中投入人的专业知识。Phase 0 运行扫描器并汇总清单。Phase 1 在编写 Java 之前构建 parity harness,对 PHP 原版和 Java 移植版重放请求/响应对。这个 harness 必须在可正常工作的 PHP 上通过,并且在你故意破坏它时失败,因为一个漏掉人为注入破坏的 harness 是不可信的。Phase 2 播下规则手册和差距清单(RULEBOOK.md、GAP_INVENTORY.md),Phase 3 在将其推广到整个应用之前,用有代表性的文件对它进行压力测试。
正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。