2017-01-15 10 views
5

Ich möchte eine Mischaufgabe aus einer benutzerdefinierten Mischaufgabe ausführen.Wie führe ich eine Mischaufgabe aus einer Mischaufgabe aus?

So etwas wie

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

Aber ich kann nicht herausfinden, wie ein Shell-Befehl auszuführen. Wenn es einen einfacheren Weg gibt (abgesehen von einem Bash-Skript), lass es mich wissen.

Antwort

9

Shell ist die redundante Verbindung hier. Wenn Sie edeliver Aufgabe ausführen möchten, führen Mix.Tasks.Edeliver#run:

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

Während ich nie versucht, eine Mischung Aufgabe über Mix.shell.cmd aus innerhalb einer anderen Mischung Aufgabe ausgeführt wird, und ich bin nicht sicher, ob es am beste Praxis ist, wie es scheint, so etwas wie, was Sie streben funktionieren würde:

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

Der obige Code führt die Tests über mix test aus und gibt ihre Ausgabe aus. Hinweis: Der obige Code basiert auf Mix 1.3.4, die Oberfläche unterscheidet sich geringfügig in 1.4.0.

Was könnte einen eleganteren Ansatz sein, obwohl ein mix alias für eine „Verbund“ Aufgabe erstellen, bestehend aus den Aufgaben, die Sie auf Ihrem individuellen abhängen würde man sein:

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

Jetzt mix composite.task laufen die beide laufen soll andere Aufgaben vor my.custom.task.

1

Für Shell comand Ausführung Sie Loki verwenden können. Sie können Funktionen für die Shell-Ausführung execute/1 finden.

Und Beispiel, wie ich in Mix.Task Aufgaben für die Ausführung anderer Mischung verwendet:

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 

Oder einfach nur schauen, wie es Befehl ausführen:

@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 

Hoffe, dass es Ihnen helfen.

Verwandte Themen