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