2017-01-15 36 views
5

我想從自定義混音任務中運行混音任務。如何從混合任務中運行混合任務?

喜歡的東西

def run(_) do 
    Mix.Shell.cmd("mix edeliver build release") 
    #do other stuff 

但我無法弄清楚如何執行shell命令。如果有更簡單的方法(除了製作bash腳本),請告訴我。

回答

9

Shell是這裏的冗餘鏈接。如果你想運行edeliver任務,運行Mix.Tasks.Edeliver#run

def run(_) do 
    Mix.Tasks.Edeliver.run(~w|build release|) 
    # do other stuff 
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之前的其他任務。

1

對於執行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 

希望它可以幫助你。

相關問題