With the release of npm@5, it will now write a package-lock.json unless a npm-shrinkwrap.json already exists.
I installed npm@5 globally via:
npm install npm@5 -g
And now, if a npm-shrinkwrap.json is found during:
npm install
a warning will be printed:
npm WARN read-shrinkwrap This version of npm
is compatible with lockfileVersion@1,
but npm-shrinkwrap.json was generated for lockfileVersion@0.
I'll try to do my best with it!
So my take-away is that I should replace the shrinkwrap with the package-lock.json.
Yet why is there a new format for it? What can the package-lock.json do that the npm-shrinkwrap.json cannot?
The files have exactly the same content, but there are a handful of differences in how npm handles them, most of which are noted on the docs pages for package-lock.json and npm-shrinkwrap.json:
package-lock.jsonis never published to npm, whereasnpm-shrinkwrapis by defaultpackage-lock.jsonfiles that are not in the top-level package are ignored, but shrinkwrap files belonging to dependencies are respectednpm-shrinkwrap.jsonis backwards-compatible with npm versions 2, 3, and 4, whereaspackage-lock.jsonis only recognized by npm 5+You can convert an existing
package-lock.jsonto annpm-shrinkwrap.jsonby runningnpm shrinkwrap.Thus:
If you are not publishing your package to npm, the choice between these two files is of little consequence. You may wish to use
package-lock.jsonbecause it is the default and its name is clearer to npm beginners; alternatively, you may wish to usenpm-shrinkwrap.jsonfor backwards compatibility with npm 2-4 if it is difficult for you to ensure everyone on your development team is on npm 5+. (Note that npm 5 was released on 25th May 2017; backwards compatibility will become less and less important the further we get from that date, as most people will eventually upgrade.)If you are publishing your package to npm, you have a choice between:
package-lock.jsonto record exactly which versions of dependencies you installed, but allowing people installing your package to use any version of the dependencies that is compatible with the version ranges dictated by yourpackage.json, ornpm-shrinkwrap.jsonto guarantee that everyone who installs your package gets exactly the same version of all dependenciesThe official view described in the docs is that option 1 should be used for libraries (presumably in order to reduce the amount of package duplication caused when lots of a package's dependencies all depend on slightly different versions of the same secondary dependency), but that option 2 might be reasonable for executables that are going to be installed globally.