2017-01-15 3 views
5

私はカスタムミックスタスクの中からミックスタスクを実行したいと思います。ミックスタスクからミックスタスクを実行するにはどうすればよいですか?

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

のようなものしかし、私はシェルコマンドを実行する方法を見つけ出すことはできません。簡単な方法があれば(ただbashスクリプトを作る以外に)、私に教えてください。

答えて

9

シェルはここでは冗長リンクです。あなたが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ではわずかに異なります。

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

mix composite.taskを実行している2つを実行する必要があります。よりエレガントなアプローチはしかし、「複合」タスクのmix aliasを作成するあなたが依存するタスクからなる、カスタム1にされるだろう可能性がありますどのような

my.custom.taskの前に他のタスク。

1

シェルCOMANDを実行するために、あなたがLokiを使用することができます。シェル実行の関数は、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 

は、それはあなたを助ける願っています。

関連する問題