導入
開発環境では正常に動くのに、本番環境のデプロイでビルドが失敗したり、挙動が変わったりした経験はありませんか?その原因の多くは、ライブラリの「依存関係のズレ」にあります。本記事では、依存関係を完全に固定し、将来にわたって同じビルド結果を保証するための「凍結(Locking)」の概念と実践方法を解説します。
基礎知識
現代のアプリケーション開発では、多くの外部ライブラリを組み合わせて開発を行いますが、ライブラリ自体もさらに別のライブラリに依存しています。これを「推移的依存関係」と呼びます。
かつてnpmには「Shrinkwrap」という、この複雑な依存関係のツリー構造をすべて記録し、バージョンを固定する仕組みがありました。現在は、npm 5以降で導入された「package-lock.json」がその役割を担っています。これにより、誰がいつインストールしても、全く同じバージョンのライブラリ構成が再現される「Reproducible builds(再現可能なビルド)」が実現できるようになりました。
実装/解決策
依存関係を凍結するには、パッケージマネージャーが生成するロックファイルを必ずバージョン管理システム(Gitなど)に含めることが重要です。
1. インストール時にロックファイルが生成されることを確認する。
2. ロックファイルをGitのコミット対象に含める。
3. デプロイ環境では `npm install` ではなく、ロックファイルを厳密に読み込む `npm ci` コマンドを使用する。
サンプルプログラム
CI/CDパイプラインや本番環境のビルドスクリプトで、ロックファイルを活用した安全なインストール例です。
CI環境などで、ロックファイルの定義通りに厳密にインストールを行うコマンド
‘npm ci’ は package-lock.json が存在しない場合や、
package.json と整合性が取れない場合にエラーを出して停止します。
npm ci
以下は、プロジェクトの依存関係を表示し、ロックされているか確認する例
実際の開発では、package.json と package-lock.json をセットで管理します。
———————————————————
package.json: 依存ライブラリの範囲指定(例: ^1.0.0)
package-lock.json: 自動生成される、固定されたバージョン情報
———————————————————
実行例: 依存関係のツリーを確認
npm list
コメント: このコマンドを実行すると、現在プロジェクトが
どのバージョンのライブラリを使用しているか、
ロックファイルに基づいて正確に表示されます。
応用・注意点
現場でよくある失敗として「package-lock.json を Git で無視(.gitignoreに追加)してしまう」ケースがあります。これは絶対に避けてください。ロックファイルがないと、チームメンバーごとに微妙に異なるバージョンのライブラリがインストールされ、環境差異によるバグを生む原因になります。
また、依存関係を更新したい場合は、手動でファイルを編集するのではなく、`npm update` コマンドを使用してください。これにより、ロックファイルが安全に更新され、整合性が保たれます。常にロックファイルを「信頼できる情報の源(Single Source of Truth)」として扱うことが、安定した運用の第一歩です。

コメント