npm パッケージでの package-lock.json の扱い

npm パッケージで package-lock.json をどのように扱えばいいのかわからなかったのでメモ。


最近の npm では npm install した際に、package-lock.json が生成されます。 この pacakge-lock.json を見るとオプション*1によっては、以下のように package-lock.json に記述されるライブラリのバージョンが固定化されます。

// サンプル
    "agent-base": {
      "version": "4.2.0",
      "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.0.tgz",
      "integrity": "sha512-c+R/U5X+2zz2+UCrCFv6odQzJdoqI+YecuhnAJLa1zYaMc13zPfwMwZrr91Pd1DYNo/yPRbiM4WVf9whgwFsIg==",
      "requires": {
        "es6-promisify": "5.0.0"
      }

ただし、普段自分は gulp-nightwatch というライブラリをメンテナンスしており、 上記の様な package-lock.json を含んだ npm パッケージをリリースすると、「パッケージ利用者の人が固定化されたライブラリしか利用できず、プロジェクトで利用しているパッケージによっては依存関係が解決できないのでは?」と思い、大丈夫なのかどうか調べてみました。

結論から書くと、package-lock.json のバージョンを固定化しても問題なさそうです。 というのも、 package-lock.json は npm へ pulish ( npm へのリリース ) の際には無視されるそうです。

npm-package-lock.json | npm Documentation

One key detail about package-lock.json is that it cannot be published, and it will be ignored if found in any place other than the toplevel package. It shares a format with npm-shrinkwrap.json, which is essentially the same file, but allows publication. This is not recommended unless deploying a CLI tool or otherwise using the publication process for producing production packages.

そのため、(npm パッケージの)リポジトリに含まれていても特に問題はなく、 package-lock.json はライブラリの開発の際に利用されるもののようです。 なるほど。なるほど。

*1:save-exact