🙆

やや乱暴にyarnからnpmに移行する方法

2024/01/10に公開

概要

先日、以下のようなエラーに遭遇した。
https://zenn.dev/zurukumo/scraps/d4970eaec85b14
この問題の解決策として、自分はyarnからnpmへ移行するという方法を採用した。公式のパッケージマネージャの方が比較的に安定していて(願望)、長期的に見れば保守コストがかからないのではないか、と考えたためである。上記のエラー以外にも月に1回程度のペースでyarnに関連するエラーに遭遇していて、気持ち的にしんどくなっていたのも移行の理由として大きい。

npmもv5以降は機能・性能ともに向上しているため、yarnからnpmへの逆流現象は今後増えていくのではないかと思い、後進のために備忘録を残すことにした。

手順

1. yarn.lockを矛盾無くpackage-lock.jsonに変換

そんな器用なことはできなかった。

自分の実力ではyarn.lockを矛盾無くpackage-lock.jsonに変換するなんてことはできなかった。
そこで非常に乱暴なやり方ではあるが、バージョンのズレが生じることは許容して、その後にデグレを潰すことに注力することにした。

具体的には、

  1. yarn.lockと/node_modulesを削除
  2. npm installを実行
  3. デグレを潰す

という手順を踏んだ。
もしyarn.lockを矛盾無くpackage-lock.jsonに変換する方法があれば、コメントなどで教えていただきたい。

2. yarnとpnpmを禁止する

ルールが変更された瞬間はヒューマンエラーが起こりがちなので、システム側でヒューマンエラーの発生を抑制する。package.jsonに以下のような記述をすることで、yarnとpnpmの利用を禁止できる。

package.json
{
  (...略...)
  "engines": {
    "node": "20.x",
    "npm": "10.x",
    "yarn": "Please use npm.",
    "pnpm": "Please use npm."
  },
  (...略...)

3. コマンドを置き換える

CIやREADME.mdやシェルスクリプト等々に書かれているyarnコマンドをnpmコマンドに置き換える。

インストール

yarn or yarn install -> npm ci

ユーザー定義スクリプト

yarn <script> or yarn run <script> -> npm run <script>

ローカルCLI

yarn <command> -> npx <command>

感想

手順1で乱暴なことをしているのが心残りだ…。
手順1で時間をかけてデグレを潰すという作業が入ってくるので、プロジェクトの規模が一定以上の場合、この記事の方法は参考にならないだろう。

GitHubで編集を提案

Discussion