Yarn v3を使用する
DockerでYarn v3を使用するNext.jsの環境を構築する方法について記載します。
Next.jsで記載しますがReactでもほとんど同じです。
コンテナ起動の準備をする
まず、Dockerfile
とdocker-compose.yml
を作成します。
それぞれ以下のようにします。
FROM node:16.15.0
ENV USER_NAME=myuser
ENV TZ=Asia/Tokyo
WORKDIR /myapp
USER ${USER_NAME}
EXPOSE 3000
CMD ["yarn", "dev"]
version: '3.9'
services:
front:
build: .
volumes:
- .:/myapp
environment:
NODE_ENV: development
ports:
- 3000:3000
Yarnのバージョンを変更する
Dockerfile
とdocker-compose.yml
を作成すればコンテナを起動できます。
ターミナルでdocker compose run front bash
を実行します。
$ docker compose run front bash
コンテナが起動したらコンテナ内でyarn init -2
を実行します。
myuser@rs6437j9n45a:/myapp$ yarn init -2
試しにyarn -v
を実行します。
myuser@2246ae8aafde:/myapp$ yarn -v
3.2.0
Yarnのバージョンが3.2.0
になっています。
.yarnrc.yml
を編集する
yarn init -2
で作成されたファイルのうち.yarnrc.yml
を編集します。
以下のように記述します。
yarnPath: .yarn/releases/yarn-3.2.0.cjs
cacheFolder: "/myapp/.yarn/cache"
上記のうちyarnPath
はyarn init -2
を実行すると記述されます。
cacheFolder
にはコンテナ側のcache
へのパスを記述します。
これを記述しておくとホスト側でyarn add
などをしてしまっても以下のようなエラーが出ます。
$ yarn add <package>
Internal Error: ENOENT: no such file or directory, mkdir '/myapp'
Error: ENOENT: no such file or directory, mkdir '/myapp'
ホスト側でyarn add
を実行するとエラーの原因となることがあります。
詳細については以下の記事をご参照ください。
package.json
を編集する
package.json
を以下のように変更します。
{
"workspaces": [
"/myapp/*"
]
}
ワークスペースの設定をしています。
パスはコンテナ側のパスを記述します。
これがないとcreate-next-app
した際に以下のようなエラーが出ます。
Usage Error: The nearest package directory (/myapp/app_name) doesn't seem to be part of the project declared in /myapp.
- If /myapp isn't intended to be a project, remove any yarn.lock and/or package.json file there.
- If /myapp is intended to be a project, it might be that you forgot to list app_name in its workspace configuration.
- Finally, if /myapp is fine and you intend app_name to be treated as a completely separate project (not even a workspace), create an empty yarn.lock file in it.
TypeScriptを使用する場合
TypeScriptを使用する場合には以下のコマンドを実行します。
myuser@2246ae8aafde:/myapp$ yarn plugin import typescript
実行すると下画像のようにファイルが追加されます。
プラグインの詳細については以下をご参照ください。
ファイルを整理する
create-next-app
した際に上書きされてしまうファイルがあるので削除します。
削除するのが面倒な場合はそのままでも問題はありません。
ただし.gitignore
の内容についてはのちほど使用するため別のディレクトリに移すなどしてください。
削除するファイルは以下のとおりです。
-
.gitignore
(内容はのちほど使用します。) README.md
yarn.lock
create-next-app
する
コンテナ内にいる場合にはexit
で抜けます。
myuser@2246ae8aafde:/myapp$ exit
ホスト側で以下を実行します。
$ docker compose run --rm front yarn create next-app --ts app_name && \
cd $_ && \
mv * .* .. && \
rmdir $(pwd) && \
cd ../ && \
docker compose run --rm front sh -c "yarn install && yarn dlx @yarnpkg/sdks vscode"
カレントディレクトリに展開するため、上記のように実行しています。
また上記のように記述するとapp_name
の箇所のみ変更すれば別のプロジェクトでも対応できます。
ワークスペースを/myapp/*
と設定したため、ここでyarn install
をしないとdocker compose up
した際に以下のようなエラーが出ます。
$ docker compose up
[+] Running 1/1
⠿ Container next-yarnv3-front-1 Created 0.1s
Attaching to next-yarnv3-front-1
next-yarnv3-front-1 | Internal Error: Assertion failed: Expected workspace yarn-test (/myapp/package.json) to have been resolved. Run "yarn install" to update the lockfile
next-yarnv3-front-1 | at ze.refreshWorkspaceDependencies (/myapp/.yarn/releases/yarn-3.2.0.cjs:441:3811)
next-yarnv3-front-1 | at ze.restoreInstallState (/myapp/.yarn/releases/yarn-3.2.0.cjs:447:1240)
next-yarnv3-front-1 | at processTicksAndRejections (node:internal/process/task_queues:96:5)
next-yarnv3-front-1 | at async xm.execute (/myapp/.yarn/releases/yarn-3.2.0.cjs:574:1879)
next-yarnv3-front-1 | at async xm.validateAndExecute (/myapp/.yarn/releases/yarn-3.2.0.cjs:349:673)
next-yarnv3-front-1 | at async Is.run (/myapp/.yarn/releases/yarn-3.2.0.cjs:363:2087)
next-yarnv3-front-1 | at async GN.execute (/myapp/.yarn/releases/yarn-3.2.0.cjs:474:531)
next-yarnv3-front-1 | at async GN.validateAndExecute (/myapp/.yarn/releases/yarn-3.2.0.cjs:349:673)
next-yarnv3-front-1 | at async Is.run (/myapp/.yarn/releases/yarn-3.2.0.cjs:363:2087)
next-yarnv3-front-1 | at async Is.runExit (/myapp/.yarn/releases/yarn-3.2.0.cjs:363:2271)
next-yarnv3-front-1 exited with code 1
yarn dlx @yarnpkg/sdks vscode
についてはVSCode用の設定を生成するために実行しています。
実行するコマンドはエディタごとに異なります。
詳細については以下をご参照ください。
コマンドを実行するだけでは不十分で設定を明示的に有効にする必要があります。
有効にする方法については後述します。
.gitignore
を編集する
.gitignore
にyarn init -2
で作成された.gitignore
の内容を反映します。
# dependencies
を以下のようにします。
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
# dependencies
.yarn/*
!.yarn/patches
!.yarn/plugins
!.yarn/releases
!.yarn/sdks
!.yarn/versions
!.yarn/cache
<以下略>
npm install
できないようにする
Yarnを使用するため、npm install
できないようにします。
npm install
を使用不可にする方法は以下の記事にまとめています。
上記の記事に記載しているため、簡単に記載します。
{
"engines": {
"npm": "npmではなくyarnを使用してください"
}
}
engine-strict=true
またpackage.json
に以下を追記し、Corepackを有効化することでpnpmの使用を制限できます。
{
"packageManager": "yarn@3.2.0"
}
Corepackを有効化するには以下のコマンドを実行します。
$ corepack enable
packageManager
の箇所に設定したパッケージマネージャが使用されるようになります。
そのほかのパッケージマネージャを使用するとエラーが出ます。
packageManager
を上記のように記述した状態でpnpmを使用するとエラーが出ます。
しかし、npmは使用できてしまいます。
npmでもエラーが出るようにするためには。corepack enable npm
を実行する必要があります。
またバージョンの管理もできますが、Yarnのバージョンはyarn init -2
を実行した段階で固定されています。
そのため、packageManager
を変更してもバージョンの変更はできません。
バージョン変更はyarn set version <version>
で行います。
VSCodeを設定する
前述したとおりVSCodeの設定についてyarn dlx @yarnpkg/sdks vscode
を実行するだけでは不十分です。
設定を明示的に有効にする必要があります。
VSCodeを開き、TypeScriptのファイルを開きます。
cmd + sft + p
を入力します。
表示された入力欄にSelect TypeScript Version
と入力しEnter
を入力します。
すると下画像のように表示されるのでワークスペースのバージョンを使用
をクリックします。
ワークスペースのバージョンを使用
が表示されない場合にはVSCodeを開き直してください。
docker compose up
する
docker compose up
して正常に起動するか確認します。
$ docker compose up
エラーなく起動したら http://localhost:3000/ を確認します。
以下のように表示されたらOKです。