2017-01-15 10 views

Odpowiedz

9

Powłoka jest tutaj zbędnym łączem. Jeśli chcesz uruchomić edeliver zadanie uruchomić Mix.Tasks.Edeliver#run:

def run(_) do 
    Mix.Tasks.Edeliver.run(~w|build release|) 
    # do other stuff 
0

Choć nigdy Próbowałem uruchomione zadanie mix poprzez Mix.shell.cmd od wewnątrz innego zadania mix i nie jestem pewien, czy jest to najlepsza praktyka, wydaje się, że coś takiego, czego dąży do będzie działać:

def run(args) do 
    Mix.Shell.cmd("mix test", fn(output) -> IO.write(output) end) 
    # (...) 
end 

Powyższy kod wykonuje testy przez mix test i wypisuje ich wyniki. Uwaga: powyższy kod jest oparty na Mix 1.3.4, interfejs jest nieco inny w wersji 1.4.0.

Co może być bardziej eleganckie podejście chociaż byłoby tworząc mix alias do „kompozytowych” zadania, które składają się z zadań, które zależą i swoją niestandardową:

# inside mix.exs 
def project do 
    [ 
    # (...) 
    aliases: [ 
     "composite.task": [ 
     "test", 
     "edeliver build release", 
     "my.custom.task", 
     ] 
    ] 
    ] 
end 

Teraz działa mix composite.task należy uruchomić dwa inne zadania przed my.custom.task.

1

Za wykonanie powłoki COMAND można użyć Loki. Możesz znaleźć funkcje do wykonywania powłoki execute/1.

i przykładem, jak kiedyś w Mix.Task do wykonywania innych zadań mix:

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 

Albo po prostu patrzeć jak to wykonać polecenie:

@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 

Nadzieję, że pomoże.

Powiązane problemy