如何在 mix.exs 中为 运行 添加两次别名?
How to alias run twice in mix.exs?
我正在尝试 运行 两个不同的脚本,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"]
只有第一个文件 运行s。我尝试重新启用 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;
文件结尾包含分号。
您可以使用 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"])'|]]
虽然@Dogbert 的回答可行,但我建议您采用不同的方法。当您发现自己受困于该工具提供的功能时,通常意味着需要改变范式。
与许多其他构建工具不同,mix
欢迎创建任务。与执行多个脚本相比,这很简单、非常直接且更惯用。只需使用以下脚手架在您的 lib/mix/tasks
目录中创建一个文件,例如 my_awesome_task.ex
(创建该目录,除非它已经存在):
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|]
对于您的特定示例,您可以将多个文件传递给 运行:
mix run -r priv/repo/foo.exs -r priv/repo/bar.exs
但如果问题是如何重新启用任务,那么@Dogbert 和@mudasobwa 的方法是正确的。
我正在尝试 运行 两个不同的脚本,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"]
只有第一个文件 运行s。我尝试重新启用 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;
文件结尾包含分号。
您可以使用 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"])'|]]
虽然@Dogbert 的回答可行,但我建议您采用不同的方法。当您发现自己受困于该工具提供的功能时,通常意味着需要改变范式。
与许多其他构建工具不同,mix
欢迎创建任务。与执行多个脚本相比,这很简单、非常直接且更惯用。只需使用以下脚手架在您的 lib/mix/tasks
目录中创建一个文件,例如 my_awesome_task.ex
(创建该目录,除非它已经存在):
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|]
对于您的特定示例,您可以将多个文件传递给 运行:
mix run -r priv/repo/foo.exs -r priv/repo/bar.exs
但如果问题是如何重新启用任务,那么@Dogbert 和@mudasobwa 的方法是正确的。