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

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.



답변

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당신은 당신의 코드와 실행중인 응용 프로그램과 상호 작용할 수있는 쉘.


답변

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

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

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


답변