用途:指导在 canister 升级时迁移 Motoko actor 状态。明确要求不使用经典(legacy)持久化或 system func preupgrade/postupgrade,也不使用旧式 (with migration = ...) 语法,改用 mops 管理的迁移链。
主要能力:区分隐式迁移与显式迁移。隐式迁移适用于稳定兼容的改动,如字段可变性变化、新增 variant 构造子、Nat 转 Int 等安全超类型;显式迁移用于删除字段、重命名字段、收窄类型、新增稳定字段、首次引入稳定状态等。迁移文件放在 src/backend/migrations/,按文件名字典序回放:全新安装运行全部文件,升级只运行尚未应用的文件。
使用方式:新建文件用纯 UTC 时间戳命名 YYYYMMDD_HHMMSS.mo,不加后缀,且排序需晚于所有已有文件。文件须为 module,导出 public func migration(old : OldActor) : NewActor,OldActor 与 NewActor 都要内联,只允许 mo:core/... 和 mops 包导入,禁止导入项目模块。每个构建最多一个待应用迁移(check-limit = 1),已有待应用文件时应编辑它而非新增。已应用的迁移不可修改、删除或重命名。actor 体内稳定字段只声明类型、不写初始化器,初始值由迁移链提供。用 mops check --fix 验证升级兼容性,最后运行一次 mops build。
适用场景:规划或实施改变 actor 状态的 canister 升级、编写或重构迁移函数、首次引入稳定状态、在隐式与显式迁移间做选择。
限制:迁移函数在升级时运行一次,Time.now() 等取的是升级时刻;迁移应保持纯净、避免意外 trap,否则升级中止并保留旧版本。不要用常量或魔法值,默认值应从迁移输入或应用类型推导。多步升级每步对应一个迁移。从 legacy 持久化转换的项目首个文件 OldActor 是转换前稳定形态而非 {}。具体平台配置、收费与效果资料未提供。