はじめに
WindowsでのNerves開発環境構築はハマりどころが多いらしく。
私は詳しい方に教えてもらいつつ試みましたが、2時間かけても完了せず...。
とあるハンズオンイベントでは、Windows勢がみんなハマりまくって大変だったそうです。
しかし、Dev Containerを使うとあっさり完了。その手順を記事にします。
なお、主にこちらの書籍を、あと同様のアプローチをしているこちらのスライド も参考にさせてもらいました。
環境
- Windows 11
- WSL2
- Docker Desktop
- VS Code
- Raspberry Pi 3
- 有線LAN環境
1. 事前準備
WSL2の有効化
PowerShellで、以下を実行します。
wsl
WSLが有効になっていない場合は、
「Linux 用 Windows サブシステムがインストールされていません。(略)
任意のキーを押して Linux 用 Windows サブシステムをインストールします。(略)」
と表示され、キーを押すとインストールが始まり、WSLが有効になります。
Docker Desktopのインストール
PowerShellで、以下を実行します。
winget install --id Docker.DockerDesktop
VS Code拡張機能 Dev Containers のインストール
VS Code内でCtrl+Shift+Xを押して、"Dev Containers"を検索してインストールします。
2. Dev Containerの設定
プロジェクトフォルダの作成
適当な場所にプロジェクトフォルダを作成します。
mkdir ~\my_nerves_project
.devcontainerフォルダの作成
プロジェクトルートに.devcontainerフォルダを作成し、以下の2ファイルを作成します。
my_nerves_project/
└── .devcontainer/
├── devcontainer.json
└── Dockerfile
devcontainer.json
{
"name": "nerves-dev",
"build": {
"dockerfile": "Dockerfile"
},
"workspaceFolder": "/workspace",
"customizations": {
"vscode": {
"extensions": [
"jakebecker.elixir-ls"
]
}
},
"remoteUser": "root"
}
Dockerfile
NervesJPのDockerfileを元にさせてもらい、一部変更しました。
FROM elixir:1.18.4-otp-28
# ↑ バージョンを変更
ENV DEBCONF_NOWARNINGS=yes
# Install libraries for Nerves development
RUN apt-get update && \
apt-get install -y build-essential automake autoconf git squashfs-tools ssh-askpass pkg-config curl libmnl-dev && \
rm -rf /var/lib/apt/lists/*
# ↑ libmnl-devを追加
# Install fwup
ENV FWUP_VERSION="1.13.2"
RUN wget https://github.com/fwup-home/fwup/releases/download/v${FWUP_VERSION}/fwup_${FWUP_VERSION}_amd64.deb && \
apt-get install -y ./fwup_${FWUP_VERSION}_amd64.deb && \
rm ./fwup_${FWUP_VERSION}_amd64.deb && \
rm -rf /var/lib/apt/lists/*
# Install hex, rebar, and nerves_bootstrap
RUN mix local.hex --force && \
mix local.rebar --force && \
mix archive.install hex nerves_bootstrap --force
WORKDIR /workspace
# ↑ 追加
CMD ["/bin/bash"]
コンテナの起動
- VS Codeでプロジェクトフォルダを開く
-
Ctrl+Shift+Pでコマンドパレットを開く -
Dev Containers: Reopen in Containerを選択
コンテナのビルドが完了すると、VS Codeの左下に「Dev Container: nerves-dev」と表示されます。
VS Code内のターミナルで以下を実行して、Elixirがインストールされていることを確認します。
elixir --version
mix --version
3. Nervesプロジェクトの作成
VS Code内のターミナルで作業します。
プロジェクトの作成
mix nerves.new hello_nerves
cd hello_nerves
ターゲットデバイス接続用SSH鍵の作成
ssh-keygen
オプションは、全てデフォルト。
WiFiの設定 (有線LANで接続する場合は不要)
config/target.exsに、以下の wlan0 を追記します。
#(略)
config :vintage_net,
regulatory_domain: "00",
config: [
{"usb0", ...},
{"eth0", ...},
# ↓↓↓ ここから
{"wlan0",
%{
type: VintageNetWiFi,
vintage_net_wifi: %{
networks: [
%{
key_mgmt: :wpa_psk,
ssid: "WIFI_SSID",
psk: "WIFI_PASSWORD"
}
]
},
ipv4: %{method: :dhcp}
}}
# ↑↑↑ ここまで
]
ターゲットの設定とビルド
以下は、Raspberry Pi 3 向けの例です。使用するターゲットデバイスに合わせて変更してください。
https://hexdocs.pm/nerves/supported-targets.html#supported-targets-and-systems
export MIX_TARGET=rpi3
依存関係を取得して、ファームウェアをビルドします。
mix deps.get
mix firmware
ビルドが成功すると、プロジェクトフォルダ内の以下にファームウェアファイルが生成されます。
_build/rpi3_dev/nerves/images/hello_nerves.fw
4. SDカードへの書き込み
macOS、Linuxなら mix burn でSDカードに書き込めるようですが、Dev Container内からはSDカードに直接書き込めません。
Chocolateyを使ってWindowsにfwupをインストールし、それを使ってSDカードに書き込みします。
Chocolateyのインストール
PowerShellで、以下を実行します。
winget install --id chocolatey.chocolatey
fwupのインストール
PowerShellを管理者権限で開いて、以下を実行します。
choco install fwup -y
書き込み実行
Dev Container内で生成された.fwファイルは、Windows側からも見えます。
PowerShellを管理者権限で開き、.fwファイルがあるフォルダに移動します。
cd ~\my_nerves_project\hello_nerves\_build\rpi3_dev\nerves\images
fwupでSDカードに書き込みます。自動的にSDカードを認識してくれます。
fwup hello_nerves.fw
Use 61.89 GB memory card found at \\.\PhysicalDrive2? [y/N]
5. 起動と動作確認
起動
SDカードをRaspberry Piに挿し、電源を入れます。(WiFi設定をしていない場合は、LANケーブルも接続)
SSH接続
VS Code内のターミナルで以下を実行します。
ssh nerves.local
iexのプロンプトが表示されればOKです。
█▌ ▀▀██▄▄ ▐█
███▌ ▀▀████
hello_nerves 0.1.0 (0000000-0000-0000-0000-000000000000) arm rpi3
(略)
Nerves CLI help: https://hexdocs.pm/nerves/iex-with-nerves.html
Toolshed imported. Run h(Toolshed) for more info.
iex(1)>
動作確認
nerves.newで作成されているhello関数を呼んで、:worldが返ってくればOKです。
iex(1)> HelloNerves.hello()
:world
まとめ
Dev Containerを使うことで、WindowsでもNerves開発を環境できました!