package-lock.json を生成しないようにする
npm v5 から、package.json
とは別に、package-lock.json
というファイルが生成されるようになった。npm パッケージの依存関係が膨らんできて、「依存パッケージの依存パッケージがパッチアップデートしたことでツールが動かなくなった」といった事態が起きたりしている。
- 参考 : Potentially unsafe regular expression on new project - (regex-not update) · Issue #9692 · angular/angular-cli · GitHub
- 2018年2月頃にあった Issue なのだが、Angular CLI で生成した雛形プロジェクトが突然動かなくなって、何かと思ったら内部で使用している「regrex-not」というパッケージがパッチアップデートした際にバグを含んでいたことが原因だった、というモノ。
- Angular CLI で生成した雛形プロジェクトの
package.json
には「regrex-not」パッケージに関する記載はなく、dependencies
内のパッケージがさらに依存していた、というモノだった。 - この Issue 自体は1時間程度で解消したのだが、「依存パッケージの依存パッケージまでバージョン固定しないと安全じゃないかも…」と思わされる一件だった。
こうした問題に対処すべく、「依存パッケージの内容を全部書いておきましょう」というのが package-lock.json
の役割だ。以前からあった npm-shrinkswap.json
より高機能で、npm install
や npm update
の際に自動更新してくれるのが助かる。
しかし、この機能もまだまだ問題があって、例えば optionalDependencies
に fs-extra
が含まれているようなパッケージがあると、package-lock.json
を生成する OS によってコレを書いたり書かなかったりする。Mac で生成すると fs-extra
が書かれるのだが、この package-lock.json
を置いた状態で、Windows 環境で npm install
すると、「fs-extra
はこの OS に合っていないパッケージだ」とエラーになってしまうのだ。
色々と都合の良くないポイントが多かったので、個人的にはまだ package-lock.json
を生成しないで運用しようと思っている。
で、本題。npm v5 以降で package-lock.json
を生成しないようにするには、以下の設定を ~/.npmrc
に追加しておく。
# .npmrc
package-lock=false
コマンドラインで設定するには以下のコマンド。
$ npm config set package-lock false
ちゃんとオプションが用意されていたので助かる。