2021/11/18

update multiple package to latest at once

npm 有一個指令可以偵測套件是否有出新的可以更新,我故意裝了 jquery@2 以及 bootstrap@4。

npm ls
test@1.0.0 D:\node_test
├── bootstrap@4.6.1
└── jquery@2.2.4

我們來執行更新檢查:

npm outdated
Package    Current  Wanted  Latest  Location                Depended by
bootstrap    4.6.1   4.6.1   5.1.3  node_modules/bootstrap  node_test
jquery       2.2.4   2.2.4   3.6.0  node_modules/jquery     node_test

bootstrap 跟 jquery 都有新版本可以更新,更新指令如下:

npm install jquery@latest bootstrap@latest

如果之前就有加入 package.json 的話則不用指定 --save 或是 --save-dev,一兩個套件可能還好,假設今天有十幾個要一次更新就累了,而 npm 本身沒有提供全部更新到最新版的指令,npm update 跑的是在 package.json 的板號下的最新版,所以跨了版號就不執行了。

npmjs 當然有套件可以輔助這件事,像是 npm-check,但我們也可以透過 shell script 自己處理,以下示範 awk 以及 cut 的用法。

# 指令一,利用 awk
npm outdated | sed 1d | awk -F ' ' '{print sprintf("%s@latest", $1)}' | xargs npm install
npm outdated | sed 1d | awk -F ' ' '{print sprintf("%s@%s", $1, $4)}' | xargs npm install

# 指令二,利用 cut
npm outdated | sed 1d | cut -d' ' -f1 | xargs -I {} echo '{}@latest' | xargs npm install