[Node.js] 依存パッケージをアップデートする

最近のGitHubでは、リポジトリ上で依存している外部のライブラリやモジュールが古いままだと警告を出してくれる機能が追加されました。Webページ上でも表示されますし、git pushなどremoteと通信した際などにも確認できます。

$ git push
Total 0 (delta 0), reused 0 (delta 0)
remote: 
remote: GitHub found 6 vulnerabilities on katsube/gpwd's default branch (2 high, 4 moderate). To find out more, visit:
remote:      https://github.com/katsube/gpwd/network/alerts
remote: 
To github.com:katsube/gpwd.git
   35f20ab..5b85229  master -> master

これらを放置しておくとセキュリティホールの原因にもなりかねないので、定期的にpackage.jsonで指定しているバージョンを更新し、動作確認をする必要が出てきます。しかし1つつずつ最新のバージョンを手作業で確認するのは地獄ですよね。

そんなわけで今回はNode.jsで動作するプロジェクトで利用しているライブラリを簡単にアップデートする方法についてまとめたいと思います。

ncuでかんたんアップデート

インストール

このあたりの更新が簡単にできるncuコマンドをインストールします。npmで一発です。

$ npm install -g npm-check-updates

今回は3.1.18が入りました。

$ ncu --version
3.1.18

アップデートの確認

プロジェクトのあるディレクトリでncuとだけ打つと、packege.jsonの内容とネットワーク経由でパッケージの最新のバージョンを比較して表示してくれます。

$ ncu
Checking ()/gpwd/package.json
[====================] 2/2 100%

 commander  ^2.19.0  →  ^2.20.0 
 jest       ^23.6.0  →  ^24.8.0 

Run ncu -u to upgrade package.json

今回は「commander」「jest」が古くなってしまっていることがわかりました。

package.jsonを更新

ncu -uを実行すると、package.jsonを最新の状態に自動的に書き換えてくれます。

$ ncu -u
Upgrading ()/gpwd/package.json
[====================] 2/2 100%

 commander  ^2.19.0  →  ^2.20.0 
 jest       ^23.6.0  →  ^24.8.0 

実際にgit diffで以前にcommitした内容と比較すると書き換わっているのが確認できました。

$ git diff 5b8522 package.json
diff --git a/package.json b/package.json
index b043ea5..aa10c7f 100644
--- a/package.json
+++ b/package.json
@@ -27,9 +27,9 @@
   },
   "homepage": "https://github.com/katsube/gpw#readme",
   "dependencies": {
-    "commander": "^2.19.0"
+    "commander": "^2.20.0"
   },
   "devDependencies": {
-    "jest": "^23.6.0"
+    "jest": "^24.8.0"
   }
 }

モジュールを更新

あとはnpm installすればpackage.jsonと現在のモジュールの差分を自動的にアップデートしてくれます。

$ npm install

> fsevents@1.2.9 install ()/gpwd/node_modules/fsevents
> node install

node-pre-gyp WARN Using request for node-pre-gyp https download 
[fsevents] Success: "(略)/gpwd/node_modules/fsevents/lib/binding/Release/node-v67-darwin-x64/fse.node" is installed via remote
added 68 packages from 67 contributors, removed 140 packages, updated 166 packages, moved 17 packages and audited 873712 packages in 77.977s
found 0 vulnerabilities

最後に念のため確認。

$ ncu
Checking ()/gpwd/package.json
[====================] 2/2 100%

All dependencies match the latest package versions :)

アップデートが完了したらテストコードなどを動かして問題がないか確認をしてあげてください。お疲れ様でした!

その他

npmでアップデートの存在確認

実はnpmでもアップデートのチェックは可能です。プロジェクトのあるディレクトリへ移動し、npm outdatedを実行します。

$ npm outdated
Package    Current  Wanted  Latest  Location
commander   2.19.0  2.20.0  2.20.0  gpwd
jest        23.6.0  23.6.0  24.8.0  gpwd

このあとにpackage.jsonを手動で更新、npm installしても良いかもしれません。

yarnでアップデート

yarnの場合、最初からncu的な機能が含まれているようです。

$ yarn upgrade-interactive

詳しくはドキュメントを確認くださいませ。 https://yarnpkg.com/lang/ja/docs/cli/upgrade-interactive/yarnpkg.com

参考ページ

ハンズオンNode.js

ハンズオンNode.js

Amazon