Elixir 애플리케이션을 실행하는 방법은 무엇입니까?


82

Elixir 애플리케이션을 실행하는 올바른 방법은 무엇입니까?

다음과 같이 간단한 프로젝트를 만들고 있습니다.

mix new app

그 후에 할 수 있습니다.

mix run

기본적으로 내 앱을 한 번 컴파일합니다. 그래서 내가 추가 할 때 :

IO.puts "running"

에서 lib/app.ex내가 보는 "running"첫 번째 시간, 각각의 연속은 run일부 변경이없는 한 아무 것도하지 않습니다. 생성 된 다음으로 무엇을 할 수 app.app있습니까?

물론 내가 할 수 있다는 것을 압니다.

escript: [main_module: App]

에서 mix.exs제공 def main(args):한 다음 :

mix escript.build
./app

하지만 제 생각에는 좀 번거 롭습니다.

다음과 같은 것도 있습니다.

elixir lib/app.exs

그러나 그것은 mix.exsapp.


1
Elixir 스크립트 ( .exs파일) 를 실행하고 싶지만 믹스 앱의 컨텍스트에서 실행하려면 mix run <script>. 자세한 내용은를 참조하십시오 mix help run.
Michelle Tilley

답변:


104

mix run앱을 실행합니다. 단순히 IO.puts "something"파일에 넣으면 해당 행이 컴파일 타임에만 평가되고 런타임에는 아무 작업도 수행되지 않습니다. 앱을 시작할 때 무언가를 시작하려면 mix.exs.

일반적으로 Application시작 되는 최상위 레벨 을 원합니다 . 이를 달성하려면 다음 mod옵션을 추가 하십시오 mix.exs.

def application do
  [
    # this is the name of any module implementing the Application behaviour
    mod: {NewMix, []},
    applications: [:logger]
  ]
end

그런 다음 해당 모듈에서 애플리케이션 시작시 호출되는 콜백을 구현해야합니다.

defmodule NewMix do
  use Application

  def start(_type, _args) do
    IO.puts "starting"
    # some more stuff
  end
end

start콜백 실제로 설치 최상위 프로세스 또는 감독 트리 루트를하지만,이 경우에 당신은 이미 그것을 사용 때마다 호출되는 것을 볼 수 있어야 mix run오류 다음에 있지만,.

def start(_type, _args) do
  IO.puts "starting"
  Task.start(fn -> :timer.sleep(1000); IO.puts("done sleeping") end)
end

이 경우 우리는 콜백에서 1 초 동안 잠든 다음 무언가를 출력하는 간단한 프로세스를 시작하고 있습니다. 이것은 콜백의 API를 만족시키기에 충분 start하지만 "done sleeping". 그 이유 mix run는 콜백 실행이 완료되면 기본적으로 종료 되기 때문입니다 . 그런 일이 발생하지 않도록하려면 사용해야합니다 mix run --no-halt.이 경우 VM이 중지되지 않습니다.

응용 프로그램을 시작하는 또 다른 유용한 방법입니다 iex -S mix-이 비슷한 방식으로 행동 할 mix run --no-halt뿐만 아니라, 열 iex당신은 당신의 코드와 실행중인 응용 프로그램과 상호 작용할 수있는 쉘.


4
좋아, 그게 거의 내가 필요한 것입니다! 한 가지 더 , 또는 등 returned a bad value: :ok이 없을 때이 오류 를 설명 할 수 있습니까? 어떻게 작동하며 별도의 프로세스가 필요한 이유는 무엇입니까? 필요한 모든 것을 실행하는 스크립트를 실행할 수없는 이유는 무엇입니까? TaskAgentSupervisor
Kamil Lelonek 2015 년

18
애플리케이션 콜백은 감독 트리를 반환해야합니다. 반환하지 않으면 실패합니다. 실제로 Paweł이 표시 한 마지막 표현식을 다음으로 대체 할 수도 Supervisor.start_link [], strategy: :one_for_one있습니다.. 종료 된 작업을 반환하면 응용 프로그램이 휴면 후 실패 할 수 있습니다.
호세 Valim

1
@squixy 응용 프로그램을 사용하고 정의의 장점 중 일부는 여기에 설명되어 있습니다 : stackoverflow.com/questions/30422184/...
호세 Valim

2
장기간 실행되는 애플리케이션을 빌드하는 경우 거의 항상 Supervisor. Task가장 작은 올바른 프로그램을 사용하기 위해를 사용 했지만 Jose가 언급했듯이 거기에서 감독 트리를 시작하고 싶습니다.
Paweł Obrok 2015-06-07

1
좋은 대답입니다! 그래도 질문 하나. 당신은 "단지 IO.puts "something"파일에 넣었을 때 그 줄은 컴파일 타임에만 평가되고 런타임에는 아무 일도하지 않는다 "라고 썼습니다 . 내가보고있는 것과 일치하는 것처럼 보이지만 이것의 논리를 이해하지 못합니까? 왜 그렇게 작동합니까?
user2104969 jul.

10

Mix.Task대신 모듈로 가져 와서 작업을 실행할 수 있습니다 mix run.

나는 이것이 당신이 찾고있는 것이라고 생각 합니다 .

또한, 대신 mix <task.run>단순히 mix실행하여 기본 작업을 실행할 수 있습니다 . default_task: "bot.run"의 목록에 추가 하기 만하면 def project do [..] end됩니다 mix.exs. 여기를 참조 하십시오 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.