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?

ハマりやすいWindowsでのNerves開発環境構築は、Dev Containerで解決

8
Last updated at Posted at 2025-12-12

はじめに

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"]

コンテナの起動

  1. VS Codeでプロジェクトフォルダを開く
  2. Ctrl+Shift+Pでコマンドパレットを開く
  3. 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開発を環境できました!

参考リンク

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