はじめに
Nerves ファームウェア プロジェクトを新しいバージョンの Nerves System にアップグレードするときに実行する手順についてのメモ。
Nervesとは
一言で言うと「Elixir で IoT!?ナウでヤングで cool な Nerves フレームワーク」です。
準備
プロジェクトが現在使用している Elixir および Erlang/OTP のバージョン
elixir --version
をプロジェクトのディレクトリで実行するのが簡単です。
$ cd path/to/my_project
$ elixir --version
結果はこんな感じに出力されます。
Erlang/OTP 26 [erts-14.0.2] [source] [64-bit] [smp:10:10] [ds:10:10:10] [async-threads:1] [jit]
Elixir 1.15.2 (compiled with Erlang/OTP 26)
Mix Target と Nerves System
ターゲットデバイスの Mix Target タグと、対応する Nerves System (ターゲット用のビルドプラットフォーム) を見つけます。
Nerves Targets document を参照してください。
例として、ターゲットデバイスが Raspberry Pi 4 の場合以下の通りになります。
- Mix Target:
rpi4
- Nerves System: nerves_system_rpi4
mix.exs
Nerves プロジェクトは、関心事ごとに限定された範囲に焦点を当てるために、多くのパッケージに分散されています。
これらは mix.exs
ファイルに依存関係として列挙されています。以下は nerves_examples/blinky/mix.exs の例です。
defp deps do
[
# Dependencies for all targets
{:nerves, "~> 1.10", runtime: false},
{:shoehorn, "~> 0.9.0"},
{:ring_logger, "~> 0.10.2"},
{:toolshed, "~> 0.3.1"},
# Dependencies for all targets except :host
{:nerves_runtime, "~> 0.13.0", targets: @all_targets},
{:nerves_pack, "~> 0.7.0", targets: @all_targets},
...
# Dependencies for specific targets
{:nerves_system_rpi4, "~> 1.21", runtime: false, targets: :rpi4},
...
]
end
ほとんどの場合、変更ログで明記されていない限り下位互換性があり、通常は最新バージョンを使用しても問題ありません。ただし、Nerves System の依存関係は Erlang/OTP のバージョンに依存するので注意が必要です。具体的には、プロジェクトで使用する Erlang/OTP のメジャーバージョンは、Nerves System の依存関係が期待するメジャーバージョンと一致する必要があります。
Nerves System の依存関係によって、ターゲットで実行されている OTP バージョンが決まります。Nerves System のアップデートにより、新しいバージョンの Erlang/OTP が取り込まれた可能性を想定してください。公式の Nerves System を使用している場合は、Nerves ドキュメントのNerves System 互換性表 またはリリースに付属する変更ログで確認できます。
バージョンの不一致が発生した場合、わかりやすいエラーメッセージが表示されます。これは、Nerves ユーザーに上記のことを思い出してもらうことを目的としたものなので、怖がらずに読んでください。
基本的なワークフロー
依存関係を編集する
必要に応じて、 mix.exs
で依存関係のバージョン番号を変更します。
依存関係を掃除する
# Option 1
$ mix clean --deps
# Option 2
$ rm -rf _build deps
依存関係の固定を解除する
# Option 1
$ mix deps.unlock --all
# Option 2
$ rm mix.lock
依存関係を更新する
# Set the MIX_TARGET to the desired platform (rpi4, bbb, mangopi_mq_pro, etc.)
$ export MIX_TARGET=rpi4
$ mix deps.get
ファームウェアをビルドする
$ mix firmware
# Option 1: Insert a MicroSD card to your host machine
$ mix burn
# Option 2: Upload to an existing Nerves device
$ mix firmware.gen.script
$ ./upload.sh nerves-1234.local
重大な変更
Nerves コアチームは、管理するすべてのパッケージの下位互換性を可能な限り確保するために最善を尽くしています。ただし、外部の依存関係によって何かが変更されると、それを制御できない場合があります。このような場合、Nerves コアチームは変更履歴だけでなく、わかりやすいメッセージを考案します。
一例は VM args です。Elixir 1.15 および Erlang/OTP 26 をサポートするには、それらのバージョンによりNerves ユーザーは Erlang VM の引数を変更する必要があります。
解決策として、Nerves コア チームは、現在使用されているバージョンに応じて、変更手順を含む適切なメッセージを出力するロジックを実装しました。
また、Nerves プロジェクト テンプレートも更新され、vm.args
ファイルが条件に応じて適切に生成されるようになりました。
それに加えて、Nerves プロジェクトは、フレンドリーで熱心なコミュニティによって支えられているオープンソースプロジェクトです。バグや問題が見つかった場合は、Github Issue や Pull Request は歓迎されます。
使用されていないアーティファクトを削除
これは任意ですが、使用しなくなったバージョンのダウンロードしたアーティファクトを削除する良い機会です。
Nerves は、Nerves System の依存性を解決するときに、キャッシュミラーの 1 つからシステムとツールチェーンを自動的に取得します。これらのアーティファクトはプロジェクト間で共有するためにローカルの ~/.nerves/artifacts
にキャッシュされています。
それらはいつでも安全に削除することがきます。仮に万一必要なものが削除されても mix deps.get
を実行すれば再度ダウンロードされます。
ls ~/.nerves
rm -fr ~/.nerves