Logo
Overview

yarn v2をつかってみる

November 22, 2023
1 min read

背景

Yarnにはバージョン1とバージョン2(Berry)がありnode_modulesの肥大化を解決している模様。

キャッシュも利用していて、キャッシュが効く場合にはインストールもそれなりに速いらしいです。

効かない場合はむしろ依存関係の問題?でv1の方が10倍くらい速いときもある、謎

バージョン確認

Terminal window
yarn -v
1.22.19

とするとバージョンが分かります。

バージョン更新

Terminal window
yarn set version berry

を実行すると同一ディレクトリ配下に、

  • .yarn/
  • .yarnrc.yml

が作成されます。再度バージョンを確認すると、

Terminal window
yarn -v
4.0.2

と何故かバージョンが4に上がりました。

2とは一体?

このままだと余計なファイルがgitの管理に入ってしまうので、.gitignoreに

Terminal window
# yarn v2
.yarn/cache
.yarn/unplugged
.yarn/build-state.yml
.yarn/install-state.gz
.pnp.*

を追加しておきます。

この状態で終わらせてもいいのですが、nodets-nodeを実行したときにnode_modulesを探しにいくので実行エラーが発生してしまいます。

これはv2ではnode_modulesが生成されないためなのですが、これに対処するために.yarnrc.ymlに以下の内容を追記します。

Terminal window
nodeLinker: node-modules
yarnPath: .yarn/releases/yarn-4.0.2.cjs

node_modulesじゃなくてnode-modulesであることがポイントです。なんでハイフンなのかは謎です。これをやるとyarn install時にnode_modulesが作成されるようになり、v1のときに比べてサイズ自体はものすごく小さいのですがこれ自体をgit管理する意味はないので引き続き.gitignoreで除外設定はしておきましょう。

これでVSCodeなりでこのディレクトリを開くとバージョンが自動的に切り替わるようになりました。

Terminal window
devonly: ~ $ yarn -v
1.22.19 このYarn自体はbrew install yarnでインストールしました
devonly: ~ $ cd Developer/ios-app-decryptor
devonly: ~/Developer/ios-app-decryptor (docs *%=)$ yarn -v
4.0.2

上のようにホームディレクトリでは1.22.19だったバージョンがディレクトリを移動するだけでv2が利用できているのがわかります。

v2にない機能

v2ではv1にはあった機能のいくつかがないのでプラグインで対応します。

upgrade-interactive

例えばupgrade-interactiveは対話的にバージョン管理が行える便利なコマンドでしたが、v2だとそのまま実装されてはないので、

Terminal window
yarn plugin import interactive-tools

として追加します。

プロダクションビルド

Dockerなどでyarn installを実行するときに開発環境用のモジュールは追加したくないので、

Terminal window
yarn --production --ignore-scripts --prefer-offline

というコマンドがありましたが、v2ではこれはありません。

Terminal window
yarn plugin import workspace-tools
yarn workspaces focus --all --production

その場合、上のコマンドで代用可能なのでこちらを利用しましょう。

GitHub Actions

GitHub ActionsでSSGをビルドする際にデフォルトではyarnが入っていなかったのでnpm install -g yarnでわざわざインストールしていたのですが、これをnpm install -g yarn@2と変更します。

これでv2がインストールされるので、最終的に以下のようになります。

jobs:
publish:
runs-on: ubuntu-20.04
permissions:
contents: read
deployments: write
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Install Yarn
run: npm install -g yarn@2 # ここを変更
- name: Cache CDK Dependencies
uses: actions/cache@v3
id: cache_cdk_dependency_id
env:
cache-name: cache-cdk-dependency
with:
path: .yarn/cache # node_modulesに代えて.yarn/cacheをキャッシュする
key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('yarn.lock') }}
restore-keys: ${{ runner.os }}-build-${{ env.cache-name }}-
- name: Install Dependencies
if: ${{ steps.cache_cdk_dependency_id.outputs.cache-hit != 'true' }}
run: yarn --immutable --immutable-cache

記事は以上。