247
Help us understand the problem. What are the problem?

posted at

updated at

node.js のインストール・アップデート・バージョン切替えの手順(nodebrew、Mac)

ホームディレクトリにインストールするための手順。
環境は Mac OSX 10.15.7 Catalina。以下、ターミナルでの操作。

すでにインストーラーで入れた node.js と npm が入っている場合、一旦アンインストールする

トラブルやゴミファイルの残存を防ぐため、まっさらにしておく。
インストーラーでインストールした node.js のアンインストール

lsbom -f -l -s -pf /var/db/receipts/org.nodejs.pkg.bom \
| while read i; do
  sudo rm /usr/local/${i}
done
sudo rm -rf /usr/local/lib/node \
     /usr/local/lib/node_modules \
     /var/db/receipts/org.nodejs.*

npm(ホームディレクトリにある)のアンインストール
sudo rm -rf ~/.npm

nodebrew のインストールと設定

インストール。ホームディレクトリで以下コマンド
curl -L git.io/nodebrew | perl - setup
ホームディレクトリにインストールされる(.nodebrewディレクトリ)

インストールできたか確認(※helpにハイフン不要)
nodebrew help

ヘルプが表示されない場合はPATHを確認
echo $PATH

"ホームディレクトリ/.nodebrew/current/bin" へのPATHが通っていなければ PATH を通す。vi 等でホームディレクトリの .zshrc (無ければ作成。bash なら .bash_profile) に export PATH=$HOME/.nodebrew/current/bin:$PATH を追記。

vi操作:iで編集モード、escキーで戻り、:wqで上書き保存
export PATH=$HOME/.nodebrew/current/bin:$PATH
ターミナル再起動する(or source ~/.zshrc

今一度 PATH を確認。
echo $PATH
/Users/taku_n/.nodebrew/current/bin が追加されていればO.K.

特定バージョンを使いたいなら.zshrc に以下を追記
nodebrew use v14.17.6

nodebrew自身を最新版にアップデート
nodebrew selfupdate

node.js, npm のインストール/アップデートとバージョンの切替え

nodebrew でインストール済みの node.js のバージョンのリストを確認
nodebrew ls

メモ:Use of uninitialized value $a1 in numeric comparison (<=>) at /Users/(ユーザ)/.nodebrew/current/bin/nodebrew line 675. とメッセージが出る場合は、rm /Users/(ユーザー)/.nodebrew/node/.DS_Store で解消

現在使用中のバージョン(current:vX.X.X)と、最新の node.js のバージョン(安定版、最新版)を比較。

現在インストールしているパッケージのリストをエディタにコピペしておく(A)
npm list --depth=0 -g

一応 nodebrew 自身を最新版にアップデート
nodebrew selfupdate

node.js のインストール ※600MB以上あり結構時間かかるので注意
nodebrew install v16.8.0
(要バージョン指定。昔できた nodebrew install latest/stable はエラーとなる)

バージョンの切替え(= ~/.nodebrew/current のシンボリックリンクの切替え)
* nodebrew use v16.8.0 バージョンを指定
(nodebrew use latest/stable で最新版/安定版に切り替えることはできなくなった)

バージョンが無事切り替わっているか確認
node -v → v16.8.0

npm のアップデート(必要なら)

npm も同時にインストールされるが、最新版になっていないこともある。
最新バージョンをチェックし、現在のバージョンを確認。
npm -v → 7.21.0

新しいバージョンが出ているならアップデート
npm update -g npm

バージョンを再度確認
npm -v → 7.21.1

node.js のバージョン切替えをした場合のパッケージの移行

バージョンごとに切り分けての管理となるので、上記の nodebrew use でnode.jsのバージョンを切り替えると、切替え前にnpmでインストールしたパッケージモジュール群が使えなくなる。

~/.nodebrew/node/vx.x.x[切り替え前のバージョン]/lib/node_modules を
~/.nodebrew/node/vx.x.x[切り替え後のバージョン]/lib/node_modules に以降しても良いが、今回は移行後のバージョンに切り替えている状態で、移行前のバージョンで入れていたパッケージを新たにインストールする。

元バージョンでインストールされていたパッケージのリスト(A)を整形(全て最新版にするならバージョン外す)し、npmでグローバルにインストール。

例) npm install -g @wordpress/env eslint firebase-tools gulp-cli http-server npm npm-check-updates typescript yarn

脆弱性があるパッケージを修正
npm audit fix
(完全ではない。今回は開発環境で使うのでエラーが出ててもう動けば良しとする)

一応、現在インストールされているパッケージを確認
npm list --depth=0 -g

メモ:パッケージのインストール場所は、
~/.nodebrew/node/vx.x.x[バージョン]/lib/node_modules
※上の @wordpress/env のように、サブディレクトリ構成のものもある

メモ:node.js を移行後のバージョンに切り替えた状態で nodebrew migrate-package vx.xx.xx(移行前のバージョン) とすると、移行前バージョンでインストールしていたパッケージ群を現在のバージョンから使えるようにしてくれる。しかし、これは、~/.nodebrew/node/vx.x.x(現バージョン)/lib/node_modules/ にハードリンク(エイリアス)を作成するというものであり、実ファイルをコピーしてくれるわけではないので、移行前のバージョンを削除すると使えなくなる。パスを通す必要がある(~/.nodebrew/node/vx.x.x/bin 中に反映)もあり、node_modules 中の各パッケージのディレクトリを新バージョンのそれにコピーするだけでは動作しない。パッケージごとにパスを通す作業を考えると、新規にインストールした方が楽という判断で完全に切り分けることにした。

使わなくなった node.js の特定バージョンをアンインストール

アップデートした場合、何か問題が起きた時に戻せるように元のバージョンはしばらく残しといた方が良いと思う。

動作が問題ないことを確認した上で、不要となったものを削除
nodebrew uninstall v16.4.2
nodebrew clean v16.4.2

削除後残ってるゴミファイルがないかどうかの確認は
~/.nodebrew/src/~/.nodebrew/node を確認(nodebrew ls の出力と比較)

メモ

一時的に特定のバージョンを使う

あるスクリプトを「一時的に」特定のバージョンで実行したい場合
(例:app.js を v16.4.2 で実行。もちろん、v16.4.2 がインストールされた状態で)
nodebrew exec v16.4.2 -- node app.js

nodebrew のアンインストール・入れ直し

nodebrew コマンド としても反応が無くなり(エラーは出ない)ハマった時があった。
一旦アンインストールして入れ直そうと .nodebrew ディレクトリを削除し、上記インストールのワンライナーを実行してもインストールできなかった。
git.io/nodebrewをホームディレクトリにダウンロード、perl nodebrew setup で入れ直すことができた。完了後、ダウンロードした git.io/nodebrew は削除。

参考サイト

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
247
Help us understand the problem. What are the problem?