📌

プロジェクトの Yarn (v1.x) のバージョンを固定する(小ネタ)

commits3 min read

結論

zsh
% yarn policies set-version $(yarn -v)

動機

Yarn 1.x は速くて便利ですが、バージョンや環境の違いにより、yarn install が実行されると yarn.lock を書き換えてしまうことがあります。
git pull でコンフリクトが起きたりして地味に嫌です。

対策

その1: engines の指定と強制

.npmrc へ次のように指定すると、engines の設定を強制することができます。

.npmrc
engine-strict=true

また、 engines.npm へバージョン番号以外の文字列を指定すると、npm install は使えなくなります。

package.json
{
  "engines": {
    "node": ">=12.13",
    "npm": "use_yarn_instead"
  }
}

https://docs.npmjs.com/cli/v7/configuring-npm/package-json#engines
zsh
% npm install

npm ERR! code EBADENGINE
npm ERR! engine Unsupported engine
npm ERR! engine Not compatible with your version of node/npm: yarnpkg@1.0.0
npm ERR! notsup Not compatible with your version of node/npm: yarnpkg@1.0.0
npm ERR! notsup Required: {"npm":"use_yarn_instead"}
npm ERR! notsup Actual:   {"npm":"7.22.0","node":"v14.17.6"}

npm ERR! A complete log of this run can be found in:
npm ERR!     /Users/zenn/.npm/_logs/2021-09-08T05_12_38_243Z-debug.log

その2: yarn のバージョンを指定する

上記のように engines.yarn へバージョンを決め打ちすることも可能ですが、クローンした側の負担軽減には寄与しないため採用しません

package.json
"engines": {
  // Bad!
  "yarn": "=1.22.11"
}

代わりに yarn policies を利用します。

zsh
% yarn policies set-version $(yarn -v)    # もしくは特定バージョン

https://classic.yarnpkg.com/en/docs/cli/policies

プロジェクト下に .yarn.yarnrc が作成されます。

zsh
% tree -a .

.
├── .npmrc
├── .yarn
│   └── releases
│       └── yarn-1.22.10.cjs
├── .yarnrc
└── package.json

2 directories, 4 files

こうすることで yarn さえインストールされている環境であれば、依存パッケージのインストール時に yarn のバージョンを揃えてくれます。

zsh
# インストールされているバージョンは v1.22.5
% yarn -v
1.22.5

# プロジェクトフォルダへ移動してインストールすると...
% cd your-project
% yarn install

yarn install v1.22.10    # <-- 指定したバージョンを使ってくれる
info No lockfile found.
[1/5] 🔍  Validating package.json...
[2/5] 🔍  Resolving packages...
[3/5] 🚚  Fetching packages...
[4/5] 🔗  Linking dependencies...
[5/5] 🔨  Building fresh packages...

success Saved lockfile.
✨  Done in 0.04s.

その3: yarn (berry) は拒否する

yarn v2 (berry) 以降のバージョンでは、その1のような旧い形式の .npmrc を適用してくれないため、あらたに .yarnrc.yml を作成します。

zsh
% echo "yarn-path: \".yarn/release/yarn-$(yarn -v).cjs\"" > .yarnrc.yml
.yarnrc.yml
yarn-path: ".yarn/release/yarn-1.22.11.cjs"

これで yarn (berry)yarn install しても v1 の指定バージョンが使われます。

GitHubで編集を提案

Discussion

ログインするとコメントできます