我想從自定義混音任務中運行混音任務。如何從混合任務中運行混合任務?
喜歡的東西
def run(_) do
Mix.Shell.cmd("mix edeliver build release")
#do other stuff
但我無法弄清楚如何執行shell命令。如果有更簡單的方法(除了製作bash腳本),請告訴我。
我想從自定義混音任務中運行混音任務。如何從混合任務中運行混合任務?
喜歡的東西
def run(_) do
Mix.Shell.cmd("mix edeliver build release")
#do other stuff
但我無法弄清楚如何執行shell命令。如果有更簡單的方法(除了製作bash腳本),請告訴我。
Shell是這裏的冗餘鏈接。如果你想運行edeliver
任務,運行Mix.Tasks.Edeliver#run
:
def run(_) do
Mix.Tasks.Edeliver.run(~w|build release|)
# do other stuff
雖然我從來沒有試圖從裏面另一個組合任務運行通過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
之前的其他任務。
對於執行shell COMAND可以使用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
希望它可以幫助你。