はじめに
Elixir/Nerves で開発していると、いろんな mix タスクを使いますよね。
# 利用可能なタスクを一覧表示
mix help
# Nerves 関連タスクを絞って確認
mix help | grep firmware
# mix burn
# mix firmware
# mix firmware.burn
# mix firmware.gen.gdb
# mix firmware.gen.script
# mix firmware.image
# mix firmware.metadata
# mix firmware.patch
# mix firmware.unpack
# mix upload
よく使うタスクをざっと挙げるとこんな感じでしょうか:
mix nerves.newmix deps.getmix compilemix firmwaremix burnmix upload- ...
どこで定義されてるの?
調べてみると、これらのタスクはひとつのパッケージに集約されているわけではなく、それぞれ別々の Elixir パッケージに実装されていることが分かります。
以下に代表的なタスクとその定義元をまとめました:
| mix タスク | 提供パッケージ | 定義ファイル |
|---|---|---|
mix nerves.new |
nerves_bootstrap |
lib/mix/tasks/nerves |
mix deps.get |
elixir |
lib/mix/lib/mix/tasks |
mix firmware / mix burn
|
nerves |
lib/mix/tasks/firmware.ex |
mix uploadmix firmware.gen.script
|
ssh_subsystem_fwup |
lib/mix/tasks/firmware |
Nerves開発におけるmixタスクの実装は、用途ごとに役割分担されており、実際のソースコードを読みに行くと、裏で何をしているのか理解できて面白いです。
おわりに
普段なんとなく使っている mix コマンドも、実は複数のパッケージにまたがって定義されています。
「このタスク、どういう仕組みで動いてるんだろう?」と思ったときには、Hexパッケージのリポジトリを辿ってみると、新しい発見があるかもしれません。