npm v5から導入されたpackage-lock.jsonの管理についてです。
Node v8がLTSになったためv6からアップデートしてみたのですが、package-lock.jsonが意図せず更新されコンフリクトが発生することがあったのでpackage-lock.jsonの管理について考えてみました。
下記は環境はNode v8.9.0で確認済です。
対象読者
- チーム内でpackage-lock.jsonのコンフリクトが頻発する人
- プロジェクトごとにpackage-lock.jsonの管理を変えたい人
.npmrcを使う
npm config
コマンドで行うnpm周りの設定をプロジェクト単位で行うためのファイル。
package.jsonと同じディレクトリ階層に.npmrcというファイルを作ります。
例えば
npm config set save-exact=true
は以下のように.npmrcに記載します。
save-exact=true
そうすることでグローバルではなくプロジェクト単位でconfigを設定できます。
dependenciesやdevDependenciesのバージョンを固定
普通にnpm install --save
とかするとpackage.jsonのdependenciesのバージョンに^
が付くと思います。
この^
や~
が付くことでパッケージのバージョンのアップデートが意図せず行われることがあります。
^
や~
の意味についてはpackage.json のチルダ(~) とキャレット(^)を参考にしてください。
この^
や~
をデフォルトで付けないようにするためには.npmrcに以下を記載します。
save-exact=true
こうすることでパッケージのアップデートは防ぐことができるかと思います。
試しにnpm install --save (何かのパッケージ)
し、package.jsonを確認すると^
や~
が付いていないことが確認できると思います。
意図しないパッケージの更新がなくなり、意図しないpackge-lock.jsonの更新も減るでしょう。
optionalDependenciesを無効にする
webpackやpm2を使っているとfseventsというパッケージがインストールされていると思います。
これはwebpackなどwatch機能に使うchokidarという依存パッケージが一緒にインストールされていて、そのchokidarがfseventsに依存しているためインストールされます。
しかし、このfseventsというパッケージはmacosでしか使えません。私が所属するチームではmac使いとLinux使いがいるためこのfseventsのインストールの有無の差が必ず出てしまっていました。
そのため、macosでnpm install
すると必ずfseventsが追記されてしまいパッケージに変更がなくてもgitの差分が出てしまっていました。
このfseventsはchokidarのoptionalDependenciesでした。
fseventsがなくても問題なかったのでoptionalDependenciesはインストールしないようにしました。
.npmrcに以下を記載することでoptionalDependenciesをインストールしないようにします。
optional=false
これでoptionalDependenciesがインストールされなくなり、macosとLinuxで依存パッケージの差を少なくしました。
また、こうすることでmacosでもfseventsがpackage-lock.jsonに記載されることがなくなりました。
package-lock.jsonを使わない
あまりおすすめではありませんが、package-lock.jsonの管理をやめるのも一つの手段だと思います。
npm shrinkwrap
はあったけど、そもそもnpm v5になるまでpackage-lock.jsonは無かったわけなので・・・
ただし、これは依存関係が壊れても問題ないようなプロジェクトに限って使用してください。
私のチームでは公開しているサービスはすべてpackage-lock.jsonを作成しGit管理していますが、一部の社内でしか使わないものに関してはpackage-lock.jsonを使ってない場合もあります。
まず.npmrcに以下を記述しpackage-lock.jsonが生成されないようにします。
package-lock=false
念のため.gitignoreにも追加しておきましょう。
package-lock.json
最後に意図しないパッケージのアップデートが無いように.npmrcに以下を記述しましょう。
save-exact=true
基本的にはpackage-lock.jsonは作成・管理することをおすすめしますが、GitHub上でも結構な人が.gitignoreにしていたりしていたので紹介しました。
最後までお読み頂きありがとうございました。
他にもこ「こうやっているよ」や「こうした方がいい」などあれば教えていただけると幸いです。