SuperAPI AI 工具集

migrating-to-moc-2

编程与开发

查看项目

更新于 11-14 10:20

技能介绍

用途

本技能用于将 Motoko 项目从 moc 1 迁移到 moc 2。moc 2 是 Motoko 编译器的一次大版本发布,主要变更包括:持久化模型(Actor 默认持久化,仅支持增强正交持久化 EOP 和增量 GC)、严格性提升(原先的警告变为错误)、语法变化(部分 moc 1 写法不再能解析)、以及移除一批编译器标志。技能将每个编译诊断映射到对应的修复方法,帮助开发者按顺序完成迁移。

主要能力

  • 识别仍使用经典持久化的 Canister,并说明如何一次性升级到 EOP,或选择继续留在 moc 1。
  • 提供迁移检查清单:先在最新 moc 1 上构建干净,再升级工具链,删除已移除的标志,运行 mops check 并按顺序修复错误。
  • 列出所有被移除的标志及其替代方案(如 --legacy-persistence、--copying-gc 等需留在 moc 1;--experimental-stable-memory 改用 Region)。
  • 给出诊断代码表,说明每个在 moc 1 中为警告、在 moc 2 中变为错误的代码及其修复方式,并指出哪些错误可通过 -W <code> 临时降级(模式错误 M0116、M0050、M0115 不可降级)。
  • 说明语法变化:?? 需要空格、分支不能紧贴条件、flexible 不再是关键字、记录字面量在块位置需嵌套或加括号、保留关键字不能作标识符、异步函数体不再需要显式 async 等。
  • 说明持久化相关变更:Actor 默认持久化、preupgrade/postupgrade 仍可用但已弃用、mo:core 集合是稳定的、迁移函数写法。
  • 说明库、模块和原语的变化:导入文件必须是模块、Actor class 返回类型需为 async、mo:base/ExperimentalStableMemory 不再通过类型检查、Prim.createActor 移除等。
  • 说明工具链变化:moc --check 逐文件检查、-c/--idl/-r 只接受一个主文件、moc.js 参数变化、无 Intel-Mac 二进制等。
  • 提供同时兼容 moc 1 和 moc 2 的代码编写规则。

使用方式

  1. 确认是否有 Canister 仍使用经典持久化。经典持久化的判断依据:使用 --legacy-persistence、非增量 GC 标志(--copying-gc、--compacting-gc、--generational-gc)或 moc 0.15 之前版本构建。
  2. 若需迁移到 EOP,用 --enhanced-orthogonal-persistence 且不带 --enhanced-migration 编译那一次升级;该操作不可逆,后续升级无需标志。若需保持经典持久化,留在 moc 1。
  3. 按检查清单操作:先在最新 moc 1 上构建干净,修复 .vals()(M0269)和 preupgrade/postupgrade(M0270)弃用警告;用 mops toolchain use moc <version> 升级工具链;从 [moc].args、[build].args、[canisters.<name>].args、dfx.json 和构建脚本中删除已移除的标志;运行 mops check 并按顺序修复:语法错误、原警告变错误、M0277、M0142 和 M0193、M0131(仅当使用 --legacy-actors 构建时)。
  4. 升级线上 Canister 前,用 mops check-stable 或 moc --stable-compatible old.most new.most 检查升级兼容性。
  5. 可选:在确认没有代码再用 moc 1 构建后,采用 moc 2 的新写法。

适用场景

  • 需要将 Motoko 项目升级到 moc 2 的开发者。
  • 需要处理经典持久化 Canister 升级到 EOP 的场景。
  • 需要修复 moc 2 编译错误、删除已移除标志、调整语法的场景。
  • 需要编写同时兼容 moc 1 和 moc 2 的库或过渡期代码库的场景。

限制

  • moc 2 无法构建使用经典(32 位)持久化的 Canister;只能升级到 EOP 或留在 moc 1。
  • 部分错误(模式错误 M0116、M0050、M0115)不能通过 -W <code> 降级。
  • 从经典持久化迁移到 EOP 的操作不可逆。
  • 使用 moc 1.5.0 之前版本迁移到 EOP 的 Canister,后续升级可能触发 trap,需按上游 EOP 迁移路径使用 graph-copy stabilization。
  • 在 x86_64 Mac 上无官方二进制,需从源码构建 moc、使用 moc.js 或留在 moc 1。
  • mops bench 在 moc 2 下不能使用 --legacy-persistence 或非增量 --gc。
  • 具体收费、价格、平台等信息暂未提供。