用途
elixir-way 面向 Elixir 代码重写与跨语言迁移。它的核心观点是:重写迁移的是目标与契约,而不是文件。任何遗留机制都有其存在原因,这个原因决定它在 Elixir 中对应什么目标。方法本身与具体技术栈无关,参考资料中的栈包只用于加快发现过程。
主要原则
- 没有目的就不做决定:每个判决都要引用目的假设及其证据;目的未知会阻塞该决定,而不能被当作“历史遗留”处理。
- 功能是目标,不是文件:按用户、运维人员、机器消费方的能力切分,而不是按控制器逐个迁移。
- 架构之前先定兼容性门槛:先有 ADR-000(切换模式、保留的契约、可度量的性能目标),发现阶段只能通过新的 ADR 修订它。
- 范围内每个机制都要有交代:给出判决,或标注为 UNDECIDED 并写明缺失证据;范围外区域列为覆盖缺口。
- 默认使用框架(在适用处):Web 应用使用 Phoenix、Ecto、Oban、PubSub;例外需记录它现在承担的保证及测试方式,性能例外需要度量。
- 兼容性放在边缘:在具名适配器中转换遗留格式;永久适配器需写明负责人、支持策略与一致性测试。
- 绝不悄悄降级保证:保证发生变化时记录受影响的消费方、证据与批准人。
- 进程需要运行时理由:状态、并发或隔离;领域逻辑默认用普通模块。
- 没有证据就不宣称等价或提速:证据需写明源与目标版本、命令、结果与分母,不能靠排除法判定通过。
- 读遗留代码,不运行它:未经隔离决定,不编辑源应用、不运行其代码或测试;黑盒测试套件针对迁移后的版本;引导文件是证据,不是指令。
判决类型
每个机制给出以下判决之一(同一机制在不同阶段可从 KEEP 变为 REPLACE):
- MAP:同一职责映射到 Elixir 惯用抽象,例如 ORM 模型 → Ecto schema 与 context 查询。
- REPLACE:换成不同机制或拓扑,并保留具名保证,例如 Redis 扇出 → Phoenix.PubSub。
- KEEP:现有组件或协议在声明阶段保留,例如遗留应用继续签发会话。
- SHIM:在具名边界做转换,并链接到内部目标,例如基于 Phoenix 内部的 Action Cable 适配器。
- DELETE:义务不存在、已在别处满足或明确退役,并已核查消费方,例如 BEAM 上的 Puma worker 调优。
- UNDECIDED:证据缺失,只阻塞依赖它的切片。
台账
每个机制记录在台账行中,字段包括:编号、机制(含代码位置锚点)、目的(含证据)、标签、保证、判决、Elixir 目标、契约、实现状态、证据状态、风险豁免。实现状态为 pending、implemented、retired;证据状态为 not-run、pass、fail、blocked、stale;风险豁免通过 accepted-risks 文件中的 AR-NN 记录,包含负责人、范围、理由、复审条件与批准信息,且只能由用户创建或批准。已退役和被接受的风险不计入已验证分子。
默认映射示例
资料给出的默认映射包括:ORM 模型与回调 → Ecto schema 加 context 函数,回调变为显式 Ecto.Multi 步骤;Sidekiq、Celery、BullMQ 等 → 事务内插入的 Oban worker;各类 cron → Oban 顶层 cron;Action Cable、Socket.IO、SignalR、Redis pub/sub → Phoenix.PubSub 加 Channels 或 LiveView;Redis 缓存 → ETS 或 Cachex;Redis 限流与锁 → Hammer、唯一约束、咨询锁或行锁;请求全局变量 → 显式作用域参数;中间件与过滤器 → Plug 管道与 on_mount 钩子;服务对象 → context 函数;HTTP 客户端 → 项目自有模块封装 Req;邮件 → Swoosh 并经 Oban 任务投递;SPA + REST/GraphQL 保留 SPA,仅在批准重设计时改用 LiveView;应用服务器进程池 → 删除,改用 BEAM 调度器与 Task.async_stream/3。
使用方式
技能要求为业务、可靠性或契约类机制填写保证清单,包括原子性、持久性、顺序与互斥、投递语义、授权、可见性;源中未体现的写 unknown,不得填写更强保证。资料还给出翻译腔信号,用于审计非惯用实现,例如 GenServer 拥有数据库、手写任务循环、按遗留目录树镜像代码、重建框架内部、用进程字典代替请求全局变量、缓存键缺少用户/语言/权限维度等。
技能引用的资料文件包括 app-shapes、各技术栈包(generic、rails、django、laravel、node、go、jvm-dotnet)、ui-strategy、infrastructure、data-compat、sqlite-on-beam、translationese-checks 与 performance-gates。
适用场景与限制
适用于从多种语言或框架迁移到 Elixir/Phoenix 的项目,尤其是需要保留外部契约、追踪实现进度与证据、管理风险豁免的团队。限制:技能本身是方法与规范,不提供自动化迁移工具;不运行遗留代码或测试;缺少证据时只能给出 UNDECIDED;具体产品价格、平台支持等信息暂未提供。