SuperAPI AI 工具集

makepad-2.0-migration

编程与开发

查看项目

更新于 10-16 02:15

技能介绍

Makepad 1.x to 2.0 Migration Skill,版本基于 makepad-widgets(dev 分支),最后更新于 2026-03-03。

用途 该技能用于将项目从 Makepad 1.x 迁移到 Makepad 2.0。Makepad 2.0 是一次从编译期静态 DSL 到运行时脚本的根本性架构转变,迁移涉及语法变更、derive 宏更新、生命周期方法重命名以及新的状态管理模式。参考资料为本地文件 ./references/migration-guide.md,包含完整的迁移参考与示例。

快速语法映射表 资料给出的 1.x 与 2.0 对照如下:live_design! { ... } 对应 script_mod! { ... }(核心宏变更);<Widget> { ... } 对应 Widget{ ... }(不使用尖括号);Key = Value 对应 Key: value(使用冒号而非等号);(THEME_COLOR) 对应 theme.color_*(主题命名空间);live_body: { ... } 对应 body +: { ... }(合并操作符);#[derive(Live)] 对应 #[derive(Script)];#[derive(LiveHook)] 对应 #[derive(ScriptHook)];#[derive(Widget)] 保持不变;before_apply() 对应 on_before_apply();after_apply() 对应 on_after_apply();apply_over!() 对应 script_apply_eval!()(运行时更新);DefaultNone 对应 Default(枚举默认);LiveRegister 对应 WidgetRegister(组件注册);live_register() 对应 register_widget(vm)(注册方法);LiveId 保持不变。

分步迁移 第一步:替换宏。旧写法为 live_design! 中 import makepad_widgets::base::* 与 theme_desktop_dark::,并以 App = {{App}} 定义 ui 为 <Root>;新写法为 script_mod! 中使用 mod.prelude.widgets.,并以 startup() do #(App::script_component(vm)) 定义 ui: Root{ ... }。 第二步:更新 derive。旧写法为 #[derive(Live, LiveHook, Widget)],新写法为 #[derive(Script, ScriptHook, Widget)]。 第三步:更新 App::run。旧写法为 impl LiveRegister for App 并实现 fn live_register(cx: &mut Cx) 调用 makepad_widgets::live_design(cx);新写法为 impl App 并实现 fn run(vm: &mut ScriptVm) -> Self,调用 crate::makepad_widgets::script_mod(vm) 与 App::from_script_mod(vm, self::script_mod)。 第四步:重命名生命周期方法。旧写法为 impl LiveHook 中的 before_apply 与 after_apply;新写法为 impl ScriptHook 中的 on_before_apply 与 on_after_apply。 第五步:更新 DSL 语法。旧写法使用尖括号与等号,如 <View>、title = <Label>、draw_bg 内使用 (THEME_BG);新写法使用花括号与冒号,如 View{、title := Label{、draw_bg.color: theme.color_bg_app。 第六步:用 script_eval 替换 apply_over。旧写法为 self.label(id!(title)).apply_over(cx, live! { text: "New text" });新写法为 script_eval!(cx, { ui.title.set_text("New text") }) 或 script_apply_eval!(cx, self.ui, { title.text: "New text" })。

关键破坏性变更 属性之间不使用逗号(以空白分隔);Splash 中任何位置都不使用分号;组件类型不使用尖括号;主题常量使用 theme.* 前缀,而非 (THEME_*) 语法;命名子项使用 := 操作符,而非 =;合并操作符为 +: 而非 :,用于扩展父级属性;容器上 height: Fit 为必需(默认是 0px,而非自动);注册发生在 App::run 中,而非 live_register;字段属性 #[source] 链接到脚本对象(部分组件必需);旧 old/ 目录包含归档的 1.x 代码以供参考。

常见迁移错误 仍使用 live_design! 会导致编译错误,应替换为 script_mod!;使用 <Widget> 语法会导致解析错误,应使用 Widget{};使用 Key = Value 会导致属性未应用,应使用 Key: value;使用 (THEME_COLOR) 会触发未知 token,应使用 theme.color_*;缺少 height: Fit 会导致容器不可见(0px),应添加 height: Fit;使用 Live derive 会导致编译错误,应使用 Script;使用 before_apply 会报方法未找到,应使用 on_before_apply;属性之间使用逗号会导致解析错误,应移除逗号。

最佳实践 从示例开始,研究 examples/counter 与 examples/todo 的 2.0 模式;一次迁移一个组件,不要试图一次全部转换;查看 old/ 目录,比较新旧组件实现;测试 height: Fit,大多数不可见 UI 由缺失 height 引起;使用主题变量,将所有硬编码主题颜色替换为 theme.*;添加 new_batch: true,任何带 show_bg 和文本子项的 View 都需要它。

限制 该技能的适用范围、版本兼容性细节、平台限制及支持渠道等信息暂未提供。