What3IdolsプロジェクトをYarn v3へアップグレード

2022年02月10日

yarn

こんにちは、.ごっちです。

アイマスもくもく会を通じて What3Idols というサービス(?)の開発をし続けているのですが、勉強がてら yarn のバージョンを v1.22.XX から v3.1.1 にアップグレードさせました。

https://github.com/YutaGoto/what3idols

Yarn 2, 3 の話

yarn 自体は普段のお仕事でもだいぶ使用していますが、どれも v1 系を使用していて、v2 v3 を使用している現場は全くと言っていいほど見かけません(もちろん使っている現場もあるとは思っています。見かけていないだけです。)。

v1 と v2, v3 の差や特徴に関してはほかの記事をみてだいぶ勉強になりました。

https://www.wantedly.com/companies/wantedly/post_articles/325643

メンテナーのブログもあるのでこちらも確認しました。

個人的な認識としては、v2 から PnP(Plug’n Play)モードが使用できるということです。 yarn install したパッケージを node_modulesに展開するのではなく、 zip に圧縮して .yarn/cache に並べるモードです。こうすることによって、ファイル数が圧倒的に少なくなるほか、容量もそこまで大きくならなくなります。

また、 Zero-Installs というワークフローもあり、 .yarn/cache の中身もすべて git にコミットするというなかなか激しいパターンも取れます。これは yarn install せずともにすぐに Script を動かせるようになったり、他社や本番環境などとでライブラリそのものに差をなくすといったメリットがあります。ただ、コミットファイル量がやばいことになります。 Yarn プロジェクトも PnP + Zero-Installs モードでやっていますが、 .yarn/cache ディレクトリはけっこう激しいです。 https://github.com/yarnpkg/berry/tree/master/.yarn/cache

What3Idols での移行手順

使用する yarn のバージョンを 3 にセットする

berry を指定すると現状リリースされている最新バージョンの安定板をセットできます。もちろん、直接バージョン番号を指定できます。

https://yarnpkg.com/cli/set/version

$ yarn set version berry
$ yarn -v
3.1.1

node_modules を使用しない設定をする

この状態ですと、引き続き node_modules を使用する設定になっているはずなので変更をします。

.yarnrc.ymlnodeLinker を削除します。これで PnP モードを使用できるようになります。削除すると yarnPath だけが残っているはずです。

# .yarnrc.yml
yarnPath: .yarn/releases/yarn-3.1.1.cjs

.gitignore

What3Idols プロジェクトでは Zero-Installs に則るので .gitignore もドキュメントにあるように変更をします。

https://yarnpkg.com/getting-started/qa#which-files-should-be-gitignored

# .gitignore
# yarn3 with Zero-install (追記)
.yarn/*
!.yarn/cache
!.yarn/patches
!.yarn/plugins
!.yarn/releases
!.yarn/sdks
!.yarn/versions

CircleCI の設定

CI でも yarn install のステップを使用しないので書き換えます。

https://circleci.com/developer/ja/orbs/orb/circleci/node#usage-yarn_berry_zero_install

# .circleci/config.yml
# yarn install していた部分を書き換える
- node/install-packages:
    check-cache: always
    pkg-manager: yarn-berry
    with-cache: false

そのほか設定

この状態で起動したところ下記エラーが発生しました。

error - .yarn/__virtual__/react-bulma-components-virtual-92c18f60ac/0/cache/react-bulma-components-npm-4.1.0-ebd88e4a93-7d0165d60d.zip/node_modules/react-bulma-components/cjs/components/breadcrumb/breadcrumb.js:10:0
Module not found: react-bulma-components tried to access prop-types (a peer dependency) but it isn't provided by your application; this makes the require call ambiguous and unsound.

react-bulma-componentsprop-types を呼び出そうとしたが呼び出せず、 require 呼び出しがあいまいになってしまったエラーのようです。手動であいまいな部分を設定する必要があります。 yarn のドキュメントを見ながら .yarnrc.yml に追記します。

https://yarnpkg.com/getting-started/migration#fix-dependencies-with-packageextensions https://yarnpkg.com/configuration/yarnrc#packageExtensions

# .yarnrc.yml
packageExtensions:
  "react-bulma-components@*":
    dependencies:
      "prop-types": "*"

Dependabot

ライブラリの更新のプルリクエストの作成を Dependabot でやってたのですが、 2022/02/10 現在ではyarn2, 3には対応していないので、Depfuというサービスに乗り換えました。

移行完了

この状態で yarn dev を実行し、localhost にアクセスすると無事にページが表示されます。 commit して Vercel にデプロイしても問題なく完了し表示させることができました。

ProfilePicture

Yuta Goto

フリーランスのソフトウェアエンジニアです。現在はReact.jsを使用したWebフロントエンドの開発やRuby on Railsを使用したサーバサイドの開発を行っています。