nodebrew を使って Node.js のバージョン管理をしている場合、 npm のグローバルパッケージを移動させるのがしんどいです。
ふだんの手順
1. グローバルインストールされている npm のパッケージ一覧をメモする
こんなことしますよね。
$ npm ls -g --depth 0
/Users/kulikala/.nodebrew/node/v14.13.1/lib
├── @aws-amplify/cli@4.29.6
├── @vue/cli@4.5.7
├── aws-cdk@1.67.0
├── firebase-tools@8.12.1
├── nativescript@7.0.10
├── npm@6.14.8
└── npm-check-updates@9.0.4
コピペしてメモを残したりします。
2. nodebrew で最新の Node.js のバージョンをインストールする
$ nodebrew install latest
$ nodebrew use latest
3. 控えておいた npm パッケージたちを再インストールする
$ npm i -g @aws-amplify/cli @vue/cli aws-cdk firebase-tools nativescript npm-check-updates
nodebrew には、 migrate-package
というちょうど良さそうなコマンドがありますが、シンボリックリンクで処理してしまうので、ちょっと都合が悪かったりします。
クリーンに新規インストールした方が node_modules
フォルダがキレイになるので、自分はいつもこの方法です。
nodebrew migrate-package <version> Install global NPM packages contained in <version> to current version
4. 古い Node.js のバージョンをサヨナラする
$ nodebrew uninstall <古いversion>
$ nodebrew clean all
ルーティンをスクリプトにした
Bash 使いなので Bash で書きました。
.bash_profile
に次の内容を転記しておくと、 update_node
コマンドで全てルーティンをやってくれます。
.bash_profile
update_node () {
check_env () {
if ! command_exists nodebrew; then
echo 'This script updates node via nodebrew.' 1>&2
echo ' Please install nodebrew.' 1>&2
echo ' https://github.com/hokaccha/nodebrew' 1>&2
return 1
fi
if ! command_exists jq; then
echo 'This script uses jq as JSON parser.' 1>&2
echo ' Please install jq.' 1>&2
echo ' https://stedolan.github.io/jq/' 1>&2
return 1
fi
}
command_exists () {
command -v "$@" > /dev/null 2>&1
}
get_node_ver () {
nodebrew ls \
| grep current: \
| cut -d ' ' -f 2
}
npm_ls_global () {
npm ls -g --depth 0 --json \
| jq --raw-output '.dependencies [].from | select(. != null)'
}
if ! check_env; then
return 1
fi
echo 'Updating node...'
local NODE_CURRENT="$(get_node_ver)"
echo "Current node: ${NODE_CURRENT}"
local NPM_GLOBAL="$(npm_ls_global)"
nodebrew install latest
nodebrew use latest
local NODE_LATEST="$(get_node_ver)"
if [ "${NODE_CURRENT}" = "${NODE_LATEST}" ]; then
echo 'Already up to date.'
return 0
fi
npm i -g ${NPM_GLOBAL}
nodebrew uninstall "${NODE_CURRENT}"
nodebrew clean all
echo
echo "Node is updated to: ${NODE_LATEST}"
}