Skip to content

package-lock.json の lockfileVersion の問題と解決策

問題の概要

複数の開発者が異なるバージョンのNode.js(12/15)とnpm(6/7)を使用しているプロジェクトで、package-lock.jsonの互換性問題が発生することがあります。元々"lockfileVersion": 1で作成されたプロジェクトで、npm 7.xを使用する開発者が新しいパッケージをインストールすると、package-lock.json"lockfileVersion": 2で再作成され、npm v6を使用する開発者に問題が発生します。

npm v6では以下の警告が表示されます:

npm WARN read-shrinkwrap This version of npm is compatible with lockfileVersion@1, but package-lock.json was generated for lockfileVersion@2. I'll try to do my best with it!

解決策

1. npmのバージョン統一(推奨)

最も確実な解決策は、すべての開発環境で同じバージョンのNode.jsとnpmを使用することです。

.nvmrcを使用する方法

bash
# .nvmrcファイルを作成
echo "14.15.0" > .nvmrc

# 指定バージョンをインストールして使用
nvm install
nvm use

package.jsonのenginesフィールドを使用する方法

json
{
  "engines": {
    "node": ">=14.15.0 <15.0.0",
    "npm": "^6.14.0"
  }
}

WARNING

enginesフィールドはデフォルトでは警告のみ表示します。厳格に適用するには、.npmrcファイルに以下を追加する必要があります:

engine-strict=true

2. 明示的なlockfileバージョンの指定(npm 8.1.0以上)

npm 8.1.0以降では、--lockfile-versionフラグを使用して特定のlockfileバージョンを指定できます。

bash
# lockfileバージョン1でインストール
npm i --lockfile-version 1

# 依存関係のインストールなしでlockfileのみ更新
npm i --lockfile-version 1 --package-lock-only

3. 特定のnpmバージョンを使用する方法

一時的に古いバージョンのnpmを使用してlockfileを生成する方法:

bash
npx npm@6.14.17 install --save

4. Dockerを使用した環境統一

開発環境をコンテナ化することで、Node.js/npmのバージョン差異を完全に解消できます。

bash
# Dockerコンテナでプロジェクトを実行
docker run --rm -it -v $PWD:/app --workdir /app node:14.15.0 npm install

docker-compose.ymlの例

yaml
version: '3'
services:
  app:
    image: node:14.15.0
    working_dir: /app
    volumes:
      - .:/app
    command: npm install

技術的背景

npmのlockfileバージョンは以下のように推移しています:

  • バージョン1: npm v5およびv6で使用
  • バージョン2: npm v7で導入、v1との後方互換性あり
  • バージョン3: npm v7の非互換形式、将来のバージョンで使用予定

INFO

npm v6はlockfileバージョン2を処理できますが、警告が表示されます。基本的な機能は正常に動作するため、警告自体は無視しても問題ない場合が多いです。

ベストプラクティス

  1. チーム全体の環境統一を最優先する
  2. プロジェクトルートに.nvmrcファイルを設置する
  3. package.jsonenginesフィールドでバージョン制約を明確化する
  4. CI/CD環境でも同じNode.js/npmバージョンを使用する
  5. 定期的に依存関係とツールチェインの更新を検討する

トラブルシューティング

既にlockfileが混在している場合の対処法:

bash
# package-lock.jsonを削除して再生成
rm package-lock.json
npm install

# または、特定のnpmバージョンで再生成
rm package-lock.json
npx npm@6.14.17 install

DANGER

package-lock.jsonの削除は最終手段としてください。依存関係のバージョンが変更される可能性があり、予期しない問題を引き起こすことがあります。

まとめ

lockfileバージョンの不一致問題は、開発環境のバージョン統一によって根本的に解決できます。一時的な回避策として特定のnpmバージョンを使用する方法もありますが、チーム全体で使用するNode.js/npmのバージョンを統一することが最も堅牢な解決策です。