2017-01-15 1 views
5

사용자 지정 믹스 작업 내에서 믹스 작업을 실행하고 싶습니다.믹스 작업에서 믹스 작업을 어떻게 실행합니까?

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

같은

뭔가하지만 쉘 명령을 실행하는 방법을 알아낼 수 없습니다. 더 쉬운 방법이 있다면 (그냥 bash 스크립트를 만드는 것 외에) 알려주십시오.

답변

9

쉘은 여기서 중복 링크입니다. 당신이 edeliver 작업을 실행하려면, Mix.Tasks.Edeliver#run을 실행하면 Loki을 사용할 수 있습니다

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

쉘 '명령을 실행하십시오. 셸 실행을위한 함수는 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 

는 당신을 도울 바랍니다.