Corredor

ウェブ、プログラミングの勉強メモ。

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 installnpm update の際に自動更新してくれるのが助かる。

しかし、この機能もまだまだ問題があって、例えば optionalDependenciesfs-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

ちゃんとオプションが用意されていたので助かる。

JavaScriptエンジニアのためのNode.js入門

JavaScriptエンジニアのためのNode.js入門