用途:在 Elixir release 环境中配置 Ecto 数据库迁移。release 中无法使用 Mix,因此该技能创建一个 Release 模块,通过 bin/app_name eval 命令完成数据库创建、迁移、回滚与种子数据加载。
主要能力:
- 检测应用名与 Ecto repos(查看 mix.exs 的应用名,以及 config/config.exs 或 config/runtime.exs 中的 repos 配置)。
- 在 lib/<app_name>/release.ex 生成 Release 模块,支持多 repo。
- 提供 migrate、rollback(repo, version)、create、seed 等函数。
- 校验配置:确保 config/runtime.exs 存在生产数据库配置,支持 DATABASE_URL 或显式配置。
必要用法: 创建模块后依次执行:
- 编译:mix compile
- 本地测试:mix run -e "<AppName>.Release.migrate()"
- 构建 release:MIX_ENV=prod mix release
- 测试 release:_build/prod/rel/<app_name>/bin/<app_name> eval "<AppName>.Release.migrate()"
生产命令:
- 建库(仅首次部署):bin/<app_name> eval "<AppName>.Release.migrate()"
- 运行迁移:bin/<app_name> eval "<AppName>.Release.migrate()"
- 回滚到指定版本:bin/<app_name> eval "<AppName>.Release.rollback(<AppName>.Repo, 20240101000000)"
- 种子数据:bin/<app_name> eval "<AppName>.Release.seed()"
Phoenix 多 repo 需在 config.exs 中配置:config :<app_name>, ecto_repos: [<AppName>.Repo, <AppName>.ReadRepo]。
限制与常见问题:需先调用 Application.ensure_all_started(:ssl) 与 Application.load(@app) 再操作 repo;缺少 ecto_repos 配置会导致失败。该技能面向 release 环境,普通 Mix 环境可直接使用 Mix 任务。