メインコンテンツまでスキップ

ロックファイル

ロックファイルの役割

ロックファイルは、再現可能なインストールを実現するためのファイルです。

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」のように、ブランド名・サイズまで正確に記録されています。

レシピだけでは、買う人によって選ぶ材料が変わりますが、購入リストがあれば誰が買い物に行っても同じ材料が揃います。ロックファイルはまさにこの「購入リスト」の役割を果たします。

各パッケージマネージャーのロックファイル

ロックファイルの名前は、使用するパッケージマネージャーによって異なります。

パッケージマネージャーロックファイル名
npmpackage-lock.json
pnpmpnpm-lock.yaml
Yarnyarn.lock
Bunbun.lock

どのパッケージマネージャーを使っていても、ロックファイルの目的は同じです。実際にインストールされたパッケージの正確なバージョンを記録し、再現可能なインストールを保証します。

注意

プロジェクトでは、ロックファイルは1種類だけにしてください。たとえばpackage-lock.jsonyarn.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』より

この内容をXにポストする