mix run
chạy ứng dụng của bạn. Chỉ là khi bạn chỉ cần đưa IO.puts "something"
vào một tệp mà dòng đó chỉ được đánh giá trong thời gian biên dịch, nó không có tác dụng gì trong thời gian chạy. Nếu bạn muốn điều gì đó bắt đầu khi bạn khởi động ứng dụng của mình, bạn cần chỉ định điều đó trong của bạn mix.exs
.
Thông thường, bạn muốn một cấp cao nhất Application
sẽ bắt đầu. Để đạt được điều đó, hãy thêm một mod
tùy chọn vào mix.exs
:
def application do
[
mod: {NewMix, []},
applications: [:logger]
]
end
Và sau đó trong mô-đun đó, bạn cần triển khai một lệnh gọi lại sẽ được gọi khi khởi động ứng dụng:
defmodule NewMix do
use Application
def start(_type, _args) do
IO.puts "starting"
end
end
Lệnh start
gọi lại thực sự sẽ thiết lập quy trình cấp cao nhất hoặc gốc cây giám sát của bạn nhưng trong trường hợp này, bạn sẽ thấy rằng nó được gọi mỗi khi bạn sử dụng mix run
, mặc dù sau đó là một lỗi.
def start(_type, _args) do
IO.puts "starting"
Task.start(fn -> :timer.sleep(1000); IO.puts("done sleeping") end)
end
Trong trường hợp này, chúng tôi đang bắt đầu một quy trình đơn giản trong lệnh gọi lại của chúng tôi, chỉ ngủ trong một giây và sau đó xuất ra một thứ gì đó - điều này đủ để đáp ứng API của lệnh start
gọi lại nhưng chúng tôi không thấy "done sleeping"
. Lý do cho điều này là theo mặc định mix run
sẽ thoát sau khi lệnh gọi lại đó hoàn tất quá trình thực thi. Để điều đó không xảy ra, bạn cần sử dụng mix run --no-halt
- trong trường hợp này, máy ảo sẽ không bị dừng.
Một cách hữu ích khác để khởi động ứng dụng của bạn là iex -S mix
- điều này sẽ hoạt động theo cách tương tự mix run --no-halt
nhưng cũng mở ra một trình iex
bao nơi bạn có thể tương tác với mã và ứng dụng đang chạy của mình.
.exs
tệp) nhưng làm như vậy trong ngữ cảnh của ứng dụng kết hợp của bạn, bạn có thể chạymix run <script>
. Xemmix help run
để biết thêm thông tin.