我想在自定义混音任务中运行混音任务。
像
这样的东西def run(_) do
Mix.Shell.cmd("mix edeliver build release")
#do other stuff
但我无法弄清楚如何执行shell命令。如果有更简单的方法(除了制作bash脚本之外),请告诉我。
答案 0 :(得分:10)
Shell是这里的冗余链接。如果您要运行edeliver
任务,请运行Mix.Tasks.Edeliver#run
:
def run(_) do
Mix.Tasks.Edeliver.run(~w|build release|)
# do other stuff
答案 1 :(得分:1)
要执行shell命令,您可以使用Loki。您可以找到shell执行的函数execute/1
。
以及我在Mix.Task中用于执行其他混音任务的示例:
defmodule Mix.Tasks.Sesamex.Gen.Auth do
use Mix.Task
import Loki.Cmd
import Loki.Shell
@spec run(List.t) :: none()
def run([singular, plural]) do
execute("mix sesamex.gen.model #{singular} #{plural}")
execute("mix sesamex.gen.controllers #{singular}")
execute("mix sesamex.gen.views #{singular}")
execute("mix sesamex.gen.templates #{singular}")
execute("mix sesamex.gen.routes #{singular}")
# ...
end
end
或者看看它是如何执行命令的:
@spec execute(String.t, list(Keyword.t)) :: {Collectable.t, exit_status :: non_neg_integer}
def execute(string, opts) when is_bitstring(string) and is_list(opts) do
[command | args] = String.split(string)
say IO.ANSI.format [:green, " * execute ", :reset, string]
System.cmd(command, args, env: opts)
end
希望对你有所帮助。
答案 2 :(得分:1)
Mix.Task.run("edeliver build release")
有效
答案 3 :(得分:0)
虽然我从来没有尝试通过Mix.shell.cmd
从另一个混音任务中运行混音任务,但我不确定它是否是最佳实践,它看起来像是你的内容旨在工作:
def run(args) do
Mix.Shell.cmd("mix test", fn(output) -> IO.write(output) end)
# (...)
end
上面的代码确实通过mix test
运行测试并打印输出。注意:上面的代码基于Mix 1.3.4,界面在1.4.0中略有不同。
可能更优雅的方法是为"复合"创建mix alias。任务,包括您依赖的任务和您的自定义任务:
# inside mix.exs
def project do
[
# (...)
aliases: [
"composite.task": [
"test",
"edeliver build release",
"my.custom.task",
]
]
]
end
现在运行mix composite.task
应该在my.custom.task
之前执行另外两项任务。