8
1

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.

#NervesJPAdvent Calendar 2023

Day 6

Aliases を使ってポカミスを避ける!

Last updated at Posted at 2023-12-05

おはこんばんにちは、 2023年12月に入り、寒さが身にしみています。いかがお過ごしでしょうか!
NervesJP のポジローです。

#NervesJP のアドベントカレンダーの隙間を埋めようとしたことを若干、若干ね、後悔しています。

などと弱音は吐きますけど、始めていきましょう!

本記事は、 Nerves 開発の際にうっかり忘れがちなことを機械的にサポートする tips を紹介します。

MIX_ENV の設定忘れ

MIX_TARGET は設定しないとターゲット用のファームがそもそも作れないので忘れないのですが、 MIX_ENV の設定を忘れてしまうことがあります。

プロダクションとして出すファームウェアは必ず MIX_ENV=prod で出したいです。それは proddevconfig が異なったり、 prod はファームウェアサイズが小さくなるように Nerves で工夫されているからです。dev で作っても出さなければ問題ないですが、作り直すのも手間ですし、間違えて作ったことに「イーーー」っとなるのも嫌です。

これはなんとか仕組みでカバーしたいです。

Aliases を使う

mix には 現在のプロジェクトに固有のショートカットやタスク を作るための Aliases があります。

これが使えます。ちょっと試しに使ってみます。

mix nerves.new hello_aliases --target rpi4
cd hello_aliases
mix deps.get
[好みのエディター] mix.exs

で mix.exs を開き、編集します。

...
  def project do
    [
      app: @app,
      version: @version,
      elixir: "~> 1.11",
      archives: [nerves_bootstrap: "~> 1.12"],
      start_permanent: Mix.env() == :prod,
      deps: deps(),
      releases: [{@app, release()}],
      preferred_cli_target: [run: :host, test: :host],
      aliases: [hello: &hello/1] # この行を追加
    ]
  end

  # 以下を追加
  defp hello(args) do
    Mix.shell().info(Enum.join(["Hello" | args], " "))
  end
...

追加ができたら保存して、シェルで呼び出してみます。

mix hello
Hello
mix hello pojiro
Hello pojiro

hello タスクができました。

Aliases で mix firmware のラッパーを作る

Aliases を使えば、既にある mix firmware のラッパーを以下のように作ることができます。

...
  def project do
    [
      app: @app,
      version: @version,
      elixir: "~> 1.11",
      archives: [nerves_bootstrap: "~> 1.12"],
      start_permanent: Mix.env() == :prod,
      deps: deps(),
      releases: [{@app, release()}],
      preferred_cli_target: [run: :host, test: :host],
      aliases: [firmware: [&env_prod/1, "firmware"]] # この行を追加
    ]
  end

  # 以下を追加
  defp env_prod(_args) do
    :ok = Mix.env(:prod)
  end
...

として、mix firmware を実行すれば

export MIX_TARGET=rpi4
mix firmware
...
* [Nerves] validating vm.args
* skipping runtime configuration (config/runtime.exs not found)
* creating _build/rpi4_prod/rel/hello_aliases/releases/0.1.0/vm.args # prod で生成
Updating base firmware image with Erlang release...
Copying rootfs_overlay: /home/pojiro/Sandbox/hello_aliases/_build/rpi4_prod/nerves/rootfs_overlay
Copying rootfs_overlay: /home/pojiro/Sandbox/hello_aliases/rootfs_overlay
Building /home/pojiro/Sandbox/hello_aliases/_build/rpi4_prod/nerves/images/hello_aliases.fw...
Firmware built successfully! 🎉

Now you may install it to a MicroSD card using `mix burn` or upload it
to a device with `mix upload` or `mix firmware.gen.script`+`./upload.sh`.

prod で生成できています🎉

まとめ

簡単なプロジェクト固有タスクは Aliases を使えば、簡単に作れるよ!という tips でした。
便利なオレオレタスクを作りたい時に便利です。

寒くなってきているので、体調に気をつけて健康に過ごしましょう💪💪💪
それではまた!

8
1
1

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
8
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?