7
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Nerves ファームウェア プロジェクトを新しいバージョンの Nerves System にアップグレード

Last updated at Posted at 2023-07-09

はじめに

Nerves ファームウェア プロジェクトを新しいバージョンの Nerves System にアップグレードするときに実行する手順についてのメモ。

English

Nervesとは

一言で言うと「Elixir で IoT!?ナウでヤングで cool な Nerves フレームワーク」です。

準備

プロジェクトが現在使用している Elixir および Erlang/OTP のバージョン

elixir --versionをプロジェクトのディレクトリで実行するのが簡単です。

terminal
$ 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.exs

Nerves プロジェクトは、関心事ごとに限定された範囲に焦点を当てるために、多くのパッケージに分散されています。
これらは mix.exs ファイルに依存関係として列挙されています。以下は nerves_examples/blinky/mix.exs の例です。

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 ユーザーに上記のことを思い出してもらうことを目的としたものなので、怖がらずに読んでください。

nerves-system-otp-version-not-matching

基本的なワークフロー

依存関係を編集する

必要に応じて、 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 は歓迎されます。

CleanShot 2023-07-07 at 23 00 00

使用されていないアーティファクトを削除

これは任意ですが、使用しなくなったバージョンのダウンロードしたアーティファクトを削除する良い機会です。

Nerves は、Nerves System の依存性を解決するときに、キャッシュミラーの 1 つからシステムとツールチェーンを自動的に取得します。これらのアーティファクトはプロジェクト間で共有するためにローカルの ~/.nerves/artifacts にキャッシュされています。

それらはいつでも安全に削除することがきます。仮に万一必要なものが削除されても mix deps.get を実行すれば再度ダウンロードされます。

ls ~/.nerves

rm -fr ~/.nerves
7
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?