59
54

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

package-lock.jsonの管理をプロジェクトごとに変更する

Last updated at Posted at 2017-12-30

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にしていたりしていたので紹介しました。

最後までお読み頂きありがとうございました。
他にもこ「こうやっているよ」や「こうした方がいい」などあれば教えていただけると幸いです。

参考

59
54
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
59
54

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?