如何在mix.exs中运行两次别名?

时间:2018-01-16 23:46:04

标签: elixir mix

我试图运行两个不同的脚本,v1_to_v2_migrator.exs和update_images.exs

defp aliases do
  ["ecto.reset": ["ecto.drop", "ecto.create", "ecto.migrate", "run priv/repo/v1_to_v2_migrator.exs", "run priv/repo/update_images.exs"]

仅运行第一个文件。我已尝试重新启用run,但我无法撤消文件名。

"run 'priv/repo/v1_to_v2_migrator.exs'; run -e 'Mix.Task.reenable(:run)'"

给出了这个错误:

** (Mix) No such file: priv/repo/v1_to_v2_migrator.exs;

文件结尾包含分号。

3 个答案:

答案 0 :(得分:5)

您可以使用Mix.Task.rerun/2两次调用mix run

["ecto.reset": [
  "ecto.drop",
  "ecto.create",
  "ecto.migrate",
  ~s|run -e 'Mix.Task.rerun("run", ["priv/repo/v1_to_v2_migrator.exs"]); Mix.Task.rerun("run", ["priv/repo/update_images.exs"])'|]]

答案 1 :(得分:4)

对于您的特定示例,您可以传递多个文件来运行:

mix run -r priv/repo/foo.exs -r priv/repo/bar.exs

但如果问题是如何重新启用任务,那么@ Dogbert和@ mudasobwa的方法是正确的。

答案 2 :(得分:2)

虽然@Dogbert的回答可行,但我建议你采取不同的方法。当您发现自己坚持使用该工具提供的功能时,通常意味着需要更改范例。

与许多其他构建工具不同,mix欢迎创建任务。它比执行多个脚本更简单,更直接,更惯用。只需使用以下脚手架在my_awesome_task.ex目录中创建一个文件lib/mix/tasks(除非它已经存在,否则创建该目录):

defmodule Mix.Tasks.MyAwesomeTask do
  use Mix.Task

  @shortdoc "Migrates v1 to v2 and updates images"

  @doc false
  def run(args \\ []) do
    # it’s better to implement stuff explicitly,
    #   but this is also fine
    Mix.Tasks.Run.run(["priv/repo/v1_to_v2_migrator.exs"])
    Mix.Tasks.Run.rerun(["priv/repo/update_images.exs"])
  end
end

现在您只需要在mix.exs中调用此任务:

["ecto.reset": ~w|ecto.drop ecto.create ecto.migrate my_awesome_task|]