LoginSignup
1
1

「RustとWebAssemblyによるゲーム開発」の写経をするためのDev Containerを作った

Last updated at Posted at 2023-08-15

やったことは表題の通りです。

頭の数章を読み進めていくと、RustとNode.jsのバージョンを最新にするのは問題があることがわかりました。どのバージョンが最適かは試行錯誤が必要そうでしたが、手元にRustやNodeのバージョンを管理する仕組みを持っていませんでした。そこで、Dockerを使用することを考えました。

同書では、コードはRustの1.57.0とNode.jsの16.13.0でテストされています。Rustは1.57.0のままでは依存するモジュールのビルドに失敗したため、バージョンを最新に更新しました。Node.jsはwebpack 4との互換性を考慮して、16系を使用する、とざっくりとですが決めました。

.devcontainer/Dockerfile
FROM docker.io/node:16-alpine

ARG DEV_USER=node
ENV RUSTUP_HOME=/usr/local/rustup \
    CARGO_HOME=/usr/local/cargo \
    PATH=/usr/local/cargo/bin:$PATH \
    RUST_VERSION=1.71.0

RUN set -eux; \
    apkArch="$(apk --print-arch)"; \
    case "$apkArch" in \
        x86_64) rustArch='x86_64-unknown-linux-musl'; rustupSha256='7aa9e2a380a9958fc1fc426a3323209b2c86181c6816640979580f62ff7d48d4' ;; \
        aarch64) rustArch='aarch64-unknown-linux-musl'; rustupSha256='b1962dfc18e1fd47d01341e6897cace67cddfabf547ef394e8883939bd6e002e' ;; \
        *) echo >&2 "unsupported architecture: $apkArch"; exit 1 ;; \
    esac; \
    url="https://static.rust-lang.org/rustup/archive/1.26.0/${rustArch}/rustup-init"; \
    wget "$url"; \
    echo "${rustupSha256} *rustup-init" | sha256sum -c -; \
    chmod +x rustup-init; \
    ./rustup-init -y --no-modify-path --profile minimal --default-toolchain $RUST_VERSION --default-host ${rustArch}; \
    rm rustup-init; \
    chmod -R a+w $RUSTUP_HOME $CARGO_HOME
RUN set -eux; \
    apk add --no-cache bash git gcc musl-dev; \
    npm install -g wasm-pack; \
    rustup component add rustfmt

USER $DEV_USER

RUNディレクティブが2つに分かれていますが、これは1つにまとめられるはずです。
1つ目のRUNはRust公式のDockerfileから引き写した記述で、これ以上の変更は不要でした。2つ目のRUNは、読み進めていく中で、プロジェクトが依存するコマンドやモジュールを追加、削除しながら試行錯誤していた部分で、1つ目とは異なるレイヤーとして扱っていました。

.devcontainer/devcontainer.json
{
  "name": "game-dev-with-rust-and-wasm",
  "build": {
    "dockerfile": "Dockerfile",
    "args": {
      "DEV_USER": "node"
    }
  },
  "customizations": {
    "vscode": {
      "settings": {
        "terminal.integrated.defaultProfile.linux": "bash"
      },
      "extensions": [
        "rust-lang.rust-analyzer"
      ]
    }
  },
  "remoteUser": "node",
  "updateRemoteUserUID": true
}
1
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
1
1