npm でモジュールのバージョンを固定する

A. npm shrinkwrap

npm shrinkwrap を実行すると package.json に列挙されている依存を読みとり、実際にインストールされるべきモジュールのバージョンが列挙された npm-shrinkwrap.json というファイルが作られる。

npm install はこのファイルが存在すればこちらを優先して読むようになっている (--no-shrinkwrap オプションを与えることで無視することもできる)。

いくつか気をつける点があって:

  • devDependencies も固定するには npm shrinkwrap を実行する際に --dev オプションを与える必要がある
  • npm-shrinkwrap.json が存在しない場合、package.json の依存関係を読み取る。つまり、Bundler などのように固定された依存関係が保存されたファイルが存在しない場合にエラーないし警告を出す仕組みは (現在のところ) ない

特に後者は気を利かせてフォールバックしてほしくない時に npm だけではどうしようもないという問題がある。