結論
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"
}
}
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) # もしくは特定バージョン
プロジェクト下に .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 の指定バージョンが使われます。
↧