关于 moai-lang-elixir
moai-lang-elixir 是面向 Elixir 1.17+ 项目的开发技能,适用于使用 Phoenix、Ecto 和 OTP 的开发者。它提供涵盖 Web 开发、数据访问、测试及运行时进程的实用模式。
主要功能
- 01Elixir 语言模式
- 02Phoenix 与 LiveView 开发
- 03Ecto 模式、查询与事务
- 04OTP 进程与监督
- 05ExUnit 测试和 Mix 任务
适用场景
- 01构建 Phoenix 控制器和 LiveView 界面
- 02定义 Ecto 模式并组合查询
- 03实现 GenServer API 和监督机制
- 04测试 Elixir 应用程序行为
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ modu-ai/ moai-adk --skill moai-lang-elixir安装后在 Claude Code 中输入/moai-lang-elixir确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
modules/advanced-patterns.mdreferences/examples.mdreference.md详细介绍
快速参考(30 秒)
Elixir 1.17+ 开发专家——专注于 Phoenix 1.7、LiveView、Ecto、OTP 模式和函数式编程。
自动触发:.ex、.exs 文件,mix.exs、config/,Phoenix/LiveView 相关讨论
核心能力:
- Elixir 1.17:模式匹配、管道、协议、行为、宏
- Phoenix 1.7:控制器、LiveView、Channels、PubSub、Verified Routes
- Ecto:Schema、Changeset、查询、迁移、Multi
- OTP:GenServer、Supervisor、Agent、Task、Registry
- ExUnit:使用 setup、describe、async 进行测试
- Mix:构建工具、任务、发布
- Oban:后台作业处理
快速模式
Phoenix 控制器:定义一个使用 MyAppWeb 和 :controller 的模块。为上下文模块(例如 MyApp.Accounts)创建别名。定义 action 函数(例如 show),接收 conn 和 params 映射,并从中解构出 id。使用上下文函数(例如带 bang 的 get_user!)获取数据,再渲染模板并将数据作为 assigns 传入。
对于 create action,使用模式匹配处理上下文返回的元组。对于 ok 元组,使用管道运算符调用 put_flash,设置成功消息,再使用 ~p sigil 通过已验证路由重定向。对于包含 Ecto.Changeset 的 error 元组,渲染表单模板并传入 changeset。
带 Changeset 的 Ecto Schema:定义一个使用 Ecto.Schema 并导入 Ecto.Changeset 的模块。定义 schema 块,声明字段及其类型(例如 :string)和虚拟字段。创建一个接收 struct 和 attrs 的 changeset 函数,使用管道运算符依次调用 cast(并传入要转换的字段列表)、validate_required、带正则表达式的 validate_format、带 min 选项的 validate_length,以及 unique_constraint。
GenServer 模式:定义一个使用 GenServer 的模块。创建一个接收 initial_value 并调用 GenServer.start_link 的 start_link 函数,传入 MODULE、initial_value 和 name 选项。定义客户端 API 函数,调用 GenServer.call 并传入 MODULE 和消息 atom。实现 init 回调,返回带有状态的 ok 元组。为每种消息实现 handle_call 回调,返回包含响应和新状态的 reply 元组。
实现指南(5 分钟)
Elixir 1.17 特性
高级模式匹配:定义函数头,针对映射键和值类型进行模式匹配。使用 when 守卫子句添加限制,例如 is_binary 或 byte_size 检查。添加兜底子句,为无效输入返回 error 元组。
带错误处理的管道运算符:使用 with 特殊形式串联可能失败的操作。使用左箭头对每一步进行模式匹配;所有步骤均成功完成后,返回最终的 ok 元组。在 else 块中处理 error 元组,并原样返回。
用于多态的协议:使用 defprotocol 定义协议,并通过 @doc 和函数规范进行说明。使用 defimpl 为特定类型实现协议,并指定 for: 选项。每个实现都提供该类型对应的行为。
Phoenix 1.7 模式
LiveView 组件:使用 MyAppWeb 和 :live_view 定义模块。实现 mount 回调,接收 params、session 和 socket,并返回带有已分配状态的 ok 元组。实现 handle_event 回调以处理用户交互,使用 update 辅助函数更新 socket,并返回 noreply 元组。实现 render 回调,接收 assigns,并使用 ~H sigil 编写 HEEx 模板,通过 @ 前缀访问 assigns。
使用 Changeset 的 LiveView 表单:在 mount 中创建初始 changeset,并使用 to_form 辅助函数分配表单。实现 validate 事件处理程序,创建带有 :validate action 的 changeset,并重新分配表单。实现 save 事件处理程序,调用上下文的 create 函数;成功时使用 put_flash 和 push_navigate,出错时使用错误 changeset 重新分配表单。
Phoenix Channels:使用 MyAppWeb 和 :channel 定义模块。实现 join 回调,匹配带有尖括号动态片段的 topic 模式。使用 send 和 self() 发送 after_join 消息。实现 handle_info,使用 push 处理服务端消息。实现 handle_in,使用 broadcast! 向所有订阅者发送客户端消息。
已验证路由:在 router.ex 的 scope 块中使用 live 宏定义路由,以设置 LiveView 路由。在模板和控制器中使用 ~p sigil 编写已验证路由,并使用插值语法表示动态片段。
Ecto 模式
事务的 Multi:使用 Ecto.Multi.new(),并通过管道运算符依次调用操作;使用 Ecto.Multi.update,传入名称原子和 changeset 函数。需要获取前序步骤结果时,使用带函数回调的 Ecto.Multi.insert。将最终的 Multi 通过管道传给 Repo.transaction(),它会返回带有命名结果的 ok 或 error 元组。
查询组合:创建包含可组合查询函数的查询模块。定义一个返回 from 表达式的基础函数。创建筛选函数,为 query 设置默认参数,并返回带有 where 子句的修改后 from 表达式。通过管道运算符串联这些函数,再传给 Repo.all。
高级实现(10 分钟以上)
如需全面了解以下内容:
- 使用 releases 进行生产部署
- 使用 libcluster 构建分布式系统
- 高级 LiveView 模式(streams、组件)
- OTP 监督树和动态监督器
- Telemetry 和可观测性
- 安全最佳实践
- CI/CD 集成模式
请参阅:
- 高级模式 - 完整的高级模式指南
Context7 库映射
- /elixir-lang/elixir - Elixir 语言文档
- /phoenixframework/phoenix - Phoenix Web 框架
- /phoenixframework/phoenix_live_view - LiveView 实时 UI
- /elixir-ecto/ecto - 数据库封装器和查询语言
- /sorentwo/oban - 后台作业处理
配合使用效果良好
moai-domain-backend- REST API 和微服务架构moai-domain-database- SQL 模式和查询优化moai-workflow-testing- DDD 和测试策略moai-essentials-debug- AI 驱动的调试moai-platform-deploy- 部署和基础设施
故障排除
常见问题:
Elixir 版本检查:运行 elixir --version,确认版本为 1.17+;运行 mix --version,检查 Mix 构建工具版本。
依赖项问题:运行 mix deps.get 获取依赖项,运行 mix deps.compile 编译依赖项,运行 mix clean 删除构建产物。
数据库迁移:运行 mix ecto.create 创建数据库,运行 mix ecto.migrate 执行迁移,运行 mix ecto.rollback 回滚上一次迁移。
Phoenix 服务端:运行 mix phx.server 启动服务端,运行 iex -S mix phx.server 在启动时打开 IEx shell,运行 MIX_ENV=prod mix release 构建生产环境 release。
LiveView 未加载:
- 在浏览器开发者控制台中检查 websocket 连接
- 确认 endpoint 配置包含 websocket transport
- 确保 Phoenix.LiveView 已列在 mix.exs 依赖项中
最后更新:2026-01-11 状态:活跃(v1.1.0)