ロックファイル
ロックファイルの役割
ロックファイルは、再現可能なインストールを実現するためのファイルです。
package.jsonには、パッケージのバージョンが"^3.22.0"のようにバージョン範囲で指定されています。この指定は「3.22.0以上4.0.0未満」という意味なので、インストールするタイミングによって実際にインストールされるバージョンが異なる可能性があります。
たとえば、あなたが月曜日にnpm installしたときは3.22.0がインストールされたのに、チームメンバーが水曜日にnpm installすると3.23.0がインストールされる、ということが起こりえます。
バージョンが違えば、動作が微妙に異なったり、思わぬバグに遭遇したりすることがあります。「自分の環境では動くのに、他のメンバーの環境では動かない」という事態は避けたいものです。
ロックファイルは、この問題を解決します。npm installを実行したときに実際にインストールされた正確なバージョンを記録しておき、次回以降のインストールでは同じバージョンが使われるようにします。
レシピと購入リストのたとえ
package.jsonとロックファイルの関係は、料理にたとえるとわかりやすいです。
- package.jsonは「レシピ」です。「小麦粉200g、バター適量、砂糖大さじ2」のように、必要な材料とおおよその量が書かれています。
- ロックファイルは「材料の購入リスト」です。「○○製粉の薄力粉200g、△△牧場のバター50g、□□製糖の上白糖30g」のように、ブランド名・サイズまで正確に記録されています。
レシピだけでは、買う人によって選ぶ材料が変わりますが、購入リストがあれば誰が買い物に行っても同じ材料が揃います。ロックファイルはまさにこの「購入リスト」の役割を果たします。
各パッケージマネージャーのロックファイル
ロックファイルの名前は、使用するパッケージマネージャーによって異なります。
| パッケージマネージャー | ロックファイル名 |
|---|---|
| npm | package-lock.json |
| pnpm | pnpm-lock.yaml |
| Yarn | yarn.lock |
| Bun | bun.lock |
どのパッケージマネージャーを使っていても、ロックファイルの目的は同じです。実際にインストールされたパッケージの正確なバージョンを記録し、再現可能なインストールを保証します。
プロジェクトでは、ロックファイルは1種類だけにしてください。たとえばpackage-lock.jsonとyarn.lockが両方あると、どちらを正とすべきかわからなくなり、混乱の原因になります。チームで使うパッケージマネージャーを統一し、対応するロックファイルだけを管理しましょう。
ロックファイルが更新されるタイミング
ロックファイルは手動で編集するものではありません。次の操作を行ったときに、パッケージマネージャーが自動的に更新します。
- パッケージを追加したとき(
npm install <パッケージ名>) - パッケージを削除したとき(
npm uninstall <パッケージ名>) package.jsonのバージョン指定を変更してnpm installを実行したとき
逆に、ロックファイルがすでにある状態でnpm installを引数なしで実行した場合は、ロックファイルに記録されたバージョンがそのままインストールされます。
ロックファイルのgit管理
必ずgitにコミットする
ロックファイルは必ずgitにコミットしてください。これはとても重要なルールです。
ロックファイルをgitで共有することで、チーム全員が同じバージョンのパッケージを使えるようになります。CI(継続的インテグレーション: コードの変更を自動でテスト・ビルドする仕組み)環境でも同じバージョンが使われるため、「開発環境では動くのにCIでは失敗する」という問題を防げます。
.gitignoreにロックファイルを入れない
.gitignoreにロックファイルを追加してはいけません。ロックファイルはプロジェクトの重要な構成要素です。
混同しやすいのがnode_modulesとの違いです。
| 対象 | gitにコミットするか | .gitignoreに入れるか |
|---|---|---|
| ロックファイル | する | 入れない |
node_modules | しない | 入れる |
node_modulesはサイズが非常に大きく、ロックファイルからいつでも再現できるためgitには含めません。一方、ロックファイルは比較的小さく、バージョンの再現性を保証する重要なファイルなので、必ずgitにコミットします。
新しくプロジェクトをはじめるときは、最初のnpm installで生成されたロックファイルを忘れずにコミットしましょう。
学びをシェアする
・ロックファイルはインストールされた正確なバージョンを記録し再現性を保証
・パッケージマネージャーごとに名前が異なる(npm→package-lock.json等)
・必ずgitにコミットし.gitignoreに入れない
・node_modulesはgitに含めずロックファイルから再現する
『サバイバルTypeScript』より