前回の記事でnpmパッケージのバージョンを固定する方法を書いた。固定したバージョンをアップデートする場合、更新されたnpm-shrinkwrap.jsonを配布した後に実施するのはnpm installだった。

説明書

  • npm update
    • npm updateすると、全パッケージが最新版に更新される(package.jsonで指定されているsemverでの最新版の事)
    • npm update pkgすると、指定したパッケージが最新版に更新される

固定したバージョンをアップデートする

npm updatenpm update pkgで更新するか、npm install pkg@versionで更新する。特殊な事情でsemverを変えたくない場合にnpm installすることになるんだと思う。

npmのバージョン。

$ node -v
v6.9.1
$ npm -v
3.10.8
$ cat npm-shrinkwrap.json
{
"name": "shrinkwrap-test",
"version": "1.0.0",
"dependencies": {
"jquery": {
"version": "3.0.0",
"from": "jquery@3.0.0",
"resolved": "https://registry.npmjs.org/jquery/-/jquery-3.0.0.tgz"
},
"jquery-ui": {
"version": "1.12.0",
"from": "jquery-ui@1.12.0",
"resolved": "https://registry.npmjs.org/jquery-ui/-/jquery-ui-1.12.0.tgz"
}
}
}
$ npm update jquery-ui
shrinkwrap-test@1.0.0 /home/vagrant/work/shrinkwrap-test
└── jquery-ui@1.12.1
$ npm ls --depth 0
shrinkwrap-test@1.0.0 /home/vagrant/work/shrinkwrap-test
├── jquery@3.0.0
└── jquery-ui@1.12.1

配付後に更新する場合はnpm install

サーバーにnpm-shrinkwrap.jsonを配付した後に実行するのは、npm installである。npm updateすると、npm-shrinkwrap.jsonを無視して全パッケージを更新することになる。ここでは、別ディレクトリにnpm-shrinkwrap.jsonをコピーして試してみる。

$ npm install
shrinkwrap-test@1.0.0 /home/vagrant/work/shrinkwrap-test2
└── jquery-ui@1.12.1
$ npm ls --depth 0
shrinkwrap-test@1.0.0 /home/vagrant/work/shrinkwrap-test2
├── jquery@3.0.0
└── jquery-ui@1.12.1
$ npm update
shrinkwrap-test@1.0.0 /home/vagrant/work/shrinkwrap-test2
└── jquery@3.1.1

npm updateするとバージョンを上げていないjqueryの最新版3.1.1がインストールされてしまった。元に戻す場合には、もう一度npm installする。

$ npm install
shrinkwrap-test@1.0.0 /home/vagrant/work/shrinkwrap-test2
└── jquery@3.0.0