运行 在生产中混合任务

Running mix tasks in production

我有许多任务和作业希望能够在生产 elixir 应用程序上手动执行。目前,我一直在通过 运行ning remote_console 中的代码执行它们。我试图通过使用 /bin/my_app command MyModule my_func 来 运行 它们,但我收到有关资源被另一个 Erlang 节点使用的错误。

我更愿意使用 /bin/my_app command MyModule my_func 样式,这样我就可以 运行 使用 ssh 的 bash 脚本。

在 Elixir 应用程序上 运行 远程任务的推荐方法是什么?

运行 mix 生产任务是不可能的,因为 mix 不是应用程序发布的一部分。

但是,显然可以在最终应用程序版本中包含任何代码,因此您可以添加将 运行 在应用程序启动时迁移的代码。

Ecto.Migrator 模块的文档包含 sample migration runner:

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"