6

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

我更喜欢使用这种/bin/my_app command MyModule my_func风格,这样我就可以使用 ssh 运行 bash 脚本。

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

4

1 回答 1

4

在生产环境中运行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"
于 2019-07-18T08:31:06.153 回答