( )
DockerでReact Native環境作成から、Expo Clientで実機確認するまで
開発関連技術
開発環境, Docker, JavaScript, React Native, Expo
iOS、Android 両方に対応するアプリを作成できる React Native。
最近、個人的に興味がわいたので、Docker環境作成にチャレンジしてみたのですが、あまり記事を見かけなかったので構築手順を書いておきます。
※この記事はQiitaからの転載です。
※2019/9/21追記
後述しますが、自分がやった時にホットリロードが効かなかったり、エミュレータ環境との連動がうまくできなかったりしてます…。
自分のやり方が悪いだけかもしれませんが、あまり Docker で構築するメリットがないかもしれません。
※2019/9/28追記
WSL で環境作り直しました。
→ WSLでReact Native + Expo環境を作ろう
前提#
- docker 導入済み
- docker-compose 導入済み
環境構築手順#
事前準備#
React Native で開発をしていく上で Expo を使うと便利です。
環境構築も比較的楽に行え、アプリの内容を QR コードで発行して簡単に実機確認ができます。
Expo アカウントを作成#
- expo.ioにいき、「Create an account」を選択
- e-mail、ユーザ名、パスワードを入力して「Create your account」を選択
Expo Client をインストール#
- 使用する iOS/Android 端末に App Store / Google Play からインストール
- 作成した Expo アカウントでログインしておく
Docker環境作成#
自分の場合は以下のディレクトリ構成で行っています。
React Native(プロジェクトフォルダ)
├ docker
│ ├ node
│ └ Dockerfile
├ .env
└ docker-compose.yml
Dockerfile#
FROM "node:10-alpine"
WORKDIR /usr/src/app/
RUN apk update && apk add bash
RUN yarn global add expo-cli
後ほどexpo start
する際にbash
が必要になりますが、使用しているイメージの alpine linuxにはbash
が入っていないため、インストールしています。
はじめからbash
が入っているイメージを使用するのもありです。
React Native のプロジェクトを作成する CLI ツールとして、以前はcreate-react-native-app
があったそうです。
現在はexpo-cli
に統合されたそうなのでこちらをインストール。
.env#
REACT_NATIVE_PACKAGER_HOSTNAME=(自分のローカルPCのIPアドレス)
コンテナに渡す環境変数を定義します。
REACT_NATIVE_PACKAGER_HOSTNAME
は、後ほどexpo start
で Expo アプリをホスティングする際のIPになります。
デフォルトではコンテナの IP を使用してしまうために、Expo Client から接続ができません。
そのためローカル PC 自体の IP を指定しておきます。
# Windows
ipconfig
# Mac
ifconfig
docker-compose.yml#
version: "3"
services:
node:
build: ./docker/node
volumes:
- ./app/:/usr/src/app
tty: true
stdin_open: true
environment:
- REACT_NATIVE_PACKAGER_HOSTNAME=${REACT_NATIVE_PACKAGER_HOSTNAME}
ports:
- "19000:19000"
- "19001:19001"
- "19002:19002"
- tty、stdin_open:
docker-compose up
したコンテナを起動させたままにするため設定 - environment:.envファイルで定義した環境変数を設定
- port:Expo で使用する3つのポートを設定
起動#
バックグラウンドで起動。
docker-compose up -d
RUN yarn global add expo-cli
の個所で WARN がたくさん出ますが、ERROR がなければ動いてくれると思われます。
(すみません、WARNの内容まではちゃんと見られていません)
Expo プロジェクト#
作成#
# コンテナの中に入る
docker-compose exec node bash
# expo プロジェクト作成
expo init .
テンプレートが選択できます。
とりあえずは blank を選択して Enter。
bash-4.4# expo init .
? Choose a template: (Use arrow keys)
----- Managed workflow -----
❯ blank a minimal app as clean as an empty canvas
blank (TypeScript) same as blank but with TypeScript configuration
tabs several example screens and tabs using react-navigation
----- Bare workflow -----
minimal bare and minimal, just the essentials to get you started
minimal (TypeScript) same as minimal but with TypeScript configuration
Expo プロジェクトの表示名を聞かれます。
入力して Enter。
? Choose a template: expo-template-blank
? Please enter a few initial configuration values.
Read more: https://docs.expo.io/versions/latest/workflow/configuration/ ‣ 0% completed
{
"expo": {
"name": "<The name of your app visible on the home screen>",
"slug": "app"
}
}
yarn を使ってパッケージをインストールするか聞かれます。Y でインストール実行。
? Yarn v1.17.3 found. Use Yarn to install dependencies? (Y/n)
これで Expo プロジェクトのひな型が作成されました。
起動#
expo start
もしくはyarn start
で Expo サーバとして起動。
しばらくするとQRコードが表示されます。
Expo Client で実機確認#
表示された QR コードを iOS/Android 端末から読み込むと、Expo Client 起動。ビルド開始。
なお、注意点として、Expo サーバになる PC と iOS/Android 端末は同じネットワークにつないでいる必要があります。
しばらくしてビルドが終わると初期ガイドが表示されます。
ガイドを消すと、Expo アプリの画面が表示されます。これが実行結果です。
blank テンプレートを選択したのでシンプルな画面ですね。
一連の手順で比較的楽に実機確認できました。
ただ、ホットリロードがうまく動作していないのか、コードの変更が即座に反映されませんでした。なぜ…。
補足#
http://localhost:19002#
アクセスすると、Expo DevTool が使用できます。
ここからシミュレータを起動したりできるみたいです。
(X Code、Android Studio のインストールや設定が別途必要になるようです)
末尾にも書いていますが、自分はうまくいきませんでした…。
http://localhost:19001#
HTML が表示されます。
expo start
時の表示で Metro Bundler だと書いてありましたが、なんなのかはよくわかってません。
http://localhost:19000#
Expo プロジェクトの情報?が表示されます。
エミュレータについて(2019/9/18追記)#
自分の環境は Windows なので、Docker 環境の中に Android のエミュレータ環境を作ろうとしましたがうまくいきませんでした…。
一応やってみたこととしてはこんな感じ。
- openjdk をインストール
- Android 公式からコマンドラインの zip ファイルをダウンロード
- Andoid SDK を格納するディレクトリを作成し、zip ファイルを解凍して配置
- Android SDK に関するパスを設定
- sdkmanager、avdmanager コマンドが実行できることを確認
- sdkmanager コマンドで必要な SDK をインストール
ここでエミュレータをインストールしたのですが、なぜか emulator コマンドが実行できませんでした。
パスはちゃんと通しているはずなのに、ひたすらNo such file or directory
が出てしまい…。一体なんなのか。
WSL で環境構築した方が、早そうです。
だから Docker で構築している記事がほとんどなかったんでしょうか…。