运行 在生产中混合任务
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"
我有许多任务和作业希望能够在生产 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"