在生产环境中运行mix
任务是不可能的,因为mix
它不是应用程序发布的一部分。
但是,显然可以在最终的应用程序版本中包含任何代码,因此您可以添加将在应用程序启动时运行迁移的代码。
模块文档Ecto.Migrator
包含一个示例迁移运行器:
defmodule MyApp.Release do
@app :my_app
def migrate do
for repo <- repos() do
{:ok, _, _} = Ecto.Migrator.with_repo(repo, &Ecto.Migrator.run(&1, :up, all: true))
end
end
def rollback(repo, version) do
{:ok, _, _} = Ecto.Migrator.with_repo(repo, &Ecto.Migrator.run(&1, :down, to: version))
end
defp repos do
Application.load(@app)
Application.fetch_env!(@app, :ecto_repos)
end
end
然后,运行迁移的命令可以作为发布启动的一部分包含在内:
bin/my_app eval "MyApp.Release.migrate"