• 作成:
  • 更新:

yarn v4からはバンドルされたJavaScriptプログラムであるreleasesやpluginsをGitにコミットする必要が無くなります

まだv4の正式リリースはされてないですし、 stable向けに完全に確定したわけでは無いですが。最近のコミットではrcとしてv4のタグが付いているため、次はv4になってこうなるでしょう。

berry/CHANGELOG.md at master · yarnpkg/berry を見る限り、メジャーバージョンの更新はレガシーAPIの廃止などがあるためでしょうね。

いい加減yarn berry移行を進めていこうとしています

yarn v1はいくらなんでももう古いです。

また懸念点の一つであった、 GitHubのDependabotがyarn berryに対応したため移行しない理由が一つ減りました。 Dependabot can now generate security and version updates for Yarn v2 and v3 | GitHub Changelog

なので移行を進めていこうとしていますが、複数人関わる仕事でやらかしたら嫌なので、まずは自分のdotfilesとか個人的なもので使っています。

バンドルされたJavaScriptファイルをコミットしたくない

yarn berryのZero-Installは論外として、 yarn本体のバンドルされた本体もコミットしたくありません。

バンドルされた巨大なプログラムをGitにコミットなんてしたくないに決まっています。 OpenAPIのYAMLとか差分が重要で見やすいものならともかくとして。

なので.gitignoreのyarn部分は以下のようになります。

.yarn/*
# !.yarn/releases
!.yarn/patches
# !.yarn/plugins
!.yarn/sdks
!.yarn/versions

この状態で他の人は一撃でプロジェクトで使っているバージョンのyarnをセットアップ出来るのか検証してみました。みんなcorepackは使っているということを前提にしています。

core

現在(yarn v3)は、

yarn set version stable

のように実行すると、 .yarnrc.ymlでは、

yarnPath: .yarn/releases/yarn-3.4.1.cjs

のように書き込まれて、 package.jsonでは、

"packageManager": "yarn@3.4.1",

のように更新されます。

ここで.yarnディレクトリをgit cleanなどで吹き飛ばして、 yarnを実行すると、以下のようなエラーになります。

Internal Error: The "yarn-path" option has been set (in /home/ncaq/dotfiles/git-hooks/.yarnrc.yml), but the specified location doesn't exist (/home/ncaq/dotfiles/git-hooks/.yarn/releases/yarn-3.4.1.cjs).
    at i (/home/ncaq/.cache/node/corepack/yarn/3.4.1/yarn.js:446:11180)
    at async t (/home/ncaq/.cache/node/corepack/yarn/3.4.1/yarn.js:446:10283)

しかし心配は不要です。 .yarnrc.ymlyarnPathの書き込みを削除すると、 corepackの指示に従ってyarnでインストールが成功します。

次のリリースではcorepackを検出するとyarnPathの書き込みはなくなるようです。多重管理は無駄なので廃止する方針のようですね。

The yarn set version command will now skip generating the yarnPath configuration on new projects if it detects you're using Corepack

berry/CHANGELOG.md at master · yarnpkg/berry

でもこれ初期設定時に触れてるだけなのでset versionだとどうなるかはまだよく分からないですね。リリースされてないので検証も面倒。 yarnの本体更新時ぐらいの話なら手動で消しても良いですが。

plugins

yarn upgrade-interactiveなどはberryからはpluginになりました。 yarn plugin import interactive-toolsのようにimportする必要があります。

しかしv4からは公式のpluginに関してはcoreにバンドルされるので、一々yarn plugin import fooする必要が無くなります。ほとんどはこれで解決ですね。

さらに、 feat: when initializing the Configuration, auto fetch the missing plugins by jj811208 · Pull Request #4912 · yarnpkg/berry を見る限り、 pluginのファイルが消滅している場合、自動でインストールしてくれるようになるようです。

実際にyarn set version from sourcesして最新版を試してみましょう。

適当にコアに含まれないサードパーティの無害そうなやつで試してみます。 yarn.build にしましょうか。

これを、

yarn plugin import https://yarn.build/latest

してから.yarnを吹き飛ばしてyarnすると… エラーになりますね。よく考えてみると.yarnごと吹き飛ばしたらせっかくソースから最新版をインストールしていても、安定版に戻ってしまうので見てもらえないのは当然ですね。

.yarn/pluginsだけを消してみましょう。見事yarn.yarn/pluginsディレクトリにpluginがインストールされました。これでv4ではpluginの本体をコミットしなくても、他のメンバーは容易くyarnコマンドだけでインストール出来るということになりますね。

これでyarn v4からはバンドルされたJavaScriptをコミットしたくないけれど、他のメンバーとも環境を統一したいという欲求を自然に満たせるようになります。

yarn v3でも頑張れば可能なのかもしれませんが、 yarn v4からは自然に出来るようになって嬉しいですね。

移行して使い分けるようにしました

yarnをcorepack管理とclassic(v1)が使われているプロジェクトで自動的に使い分ける - ncaq