mcpField
M
moai-lang-elixir

moai-lang-elixir

github.com/modu-ai开发1.2k102 次安装今天更新
代码仓库

关于 moai-lang-elixir

moai-lang-elixir 是面向 Elixir 1.17+ 项目的开发技能,适用于使用 Phoenix、Ecto 和 OTP 的开发者。它提供涵盖 Web 开发、数据访问、测试及运行时进程的实用模式。

主要功能

  1. 01Elixir 语言模式
  2. 02Phoenix 与 LiveView 开发
  3. 03Ecto 模式、查询与事务
  4. 04OTP 进程与监督
  5. 05ExUnit 测试和 Mix 任务

适用场景

  1. 01构建 Phoenix 控制器和 LiveView 界面
  2. 02定义 Ecto 模式并组合查询
  3. 03实现 GenServer API 和监督机制
  4. 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.md
references/
examples.md
reference.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)

评论

支持 Markdown