macのnodeのバージョンが上がらない!?ブラックボックス化したmacのnode環境を作り直してみる。

最近のフロント開発は、色々なライブラリを駆使して作るのが当たり前になってきました。
jQueryjQueryのライブラリだけあれば良かった時代ではもうありませんね…

さて、
最近のjsのライブラリのドキュメントでは、npmからインストールする説明がされている事が多いです。

しかし、いざインストールしようとすると、npmが動かず原因を探っていったらnode本体が原因と言う事があります。
今回は、そんな時に役立つ情報をお伝えします。

この記事で得られる事

  • nodeのバージョンが上手く変えられない」状態からの復帰方法がわかる。
  • nodebrewのインストール手順がわかる。

イントロダクション

この記事の目的

ローカルマシンにnodebrewをインストールして、最新版のnodeを動かせるようにする事です。

そのために、下記の手順で作業していきます。
もし、インストールから始めたい場合は「homebrew版のnodebrewを再インストール」から見始めてください。


  1. npmのアンイストール
  2. homebrew版のnodeをアンインストール
  3. ソース版のnodeをアンインストール
  4. 残骸ファイルを削除
  5. homebrew版のnodebrewを再インストール
  6. nodebrewで最新版のnodeを再インストール

ちなみに、今回「nodebrew」選んだ理由は、機能ではなく、検索結果で2017年の記事で割と使われていただけです。
特に、技術的な理由はありませんので悪しからず。

前提条件

  • macに導入することを想定しています。
    windowsの場合、手順が違うところがあるかもしれませんがご了承ください。
  • 「homebrew版のnodebrewを再インストール」でも簡単に説明しますが、homebrewは既にインストールしているものとして進めます。

経緯

方法だけ見たい場合は次まで飛ばしてください。

久しぶりに早速フロントエンドの実装を始めようとしたところでした。
vue.jsをインストールするために、npm install vueを実行するもエラーでインストールできませんでした。


原因は、nodeのバージョンが古いためでした。
確認して見ると、nodeのバージョンがかなり前の状態です。

$ node -v
v5.10.1

nodeのバージョンを管理する、「n」モジュールをいれていたのを思い出して、バージョンを変えて見るも、変わりません。

$ n latest
$ node -v
v5.10.1

ルートディレクトリの中身や、homebrewのインストールリストを確認した結果、homebrewでnodeのバージョン管理のパッケージが複数存在することがわかりました。

  • nvm
  • n
  • nodebrew

バージョンが管理をしているはずが、全く管理されていなかったのです。

さらに、nodeが既に複数の方法でインストールされていてもはや何が何だがわからない状態になっていました。

  • ソースからインストールしたnode
  • homebrewからインストールしたnode
  • nodebrewからインストールしたnode

こんな状態でしたので、nodeが満足に動く状態ではありませんでした。
そのため、一旦まっさらにしてnodeを入れ直すことにしました。


それでは、次の項から実際の作業説明に入ります。

npmのアンイストール

brew等でnodeを直接インストールした場合、おそらくルートディレクトリ配下に.npmが作られていると思います。
nodeでインストールしたnpmをアンインストールします。

$ npm uninstall -g npm
$ rm -rf .npm \
    node_modules

私の場合、ルートディレクトリでnpm installを実行してしまったので、node_modulesが出来ていました。
このディレクトリもいらないので、一緒に削除してしまいます。

homebrew版のnodeをアンインストール

brewでインストールしたので、brewでアンインストールします。

$ brew uninstall node

ソース版のnodeをアンインストール

ソース版を入れていた場合、brewでnodeをアンイストールしてもnodeがまだ動いているはずです。

$ node -v
v5.10.1

その場合、nodeがインストールされた場所を特定してnodeを削除します。

$ which  node
/usr/local/bin/node
$ rm -rf /usr/local/bin/node \
    node_modules

bash_profile(もしくは、bashrc)にパスを通している場合は、パスも削除します。

参考ページ

qiita.com

参考ページでは、何やらDBも消しているようです。
私の場合は、お恥ずかしながら…確認せず流れで実行してしまい、このファイルの真意を理解していません。
もし、上記で支障が出た場合、下記のコマンドを実行して見てください。

$ 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を消しても、バージョン管理でインストールしたディレクトリは残っています。 残っている、下記に関するディレクトリを削除します。

  • n
  • nvm
  • nodebrew

以降の説明は、インストールの仕方で変わります。
完全に一致しない場合は、参考程度にお読みください。

「nodebrew」と「nvm」のバージョン管理ディレクトリを削除

「nodebrew」と「nvm」は、ユーザーのルートディレクトリ配下にありました。
下記のコマンドで、nodeの履歴ファイルと一緒に削除します。

$ cd <userディレクトリ>
$ rm -rf .nvm \
    .nodebrew \
    .node_repl_history

 node_repl_historyとは

nodeのコマンド履歴が保存されるようです。

REPL | Node.js v9.4.0 Documentation

「n」のバージョン管理ディレクトリを削除

nだけ、ソース版のnodeでいれたようなので、usr/local配下に作られていました。 上記と同じように削除します。

$ cd /usr/local
$ rm -rf n

npmでインストールしたモジュールにパスを通している場合、このファイルを消すことでエラーが発生します。
bash_profile(もしくは、bashrc)にパスを通している場合は、パスも削除します。

homebrew版のnodebrewを再インストール

上記まで行えば、nodeもnpmも実行できない状態になるかと思います。

$ node -v
-bash: node: command not found
$ npm -v
-bash: npm: command not found

改めて、nodebrewをインストールして、最新版のnodeをインストールします。

homebrewをインストール

まだインストールしていない方を想定した説明です。
「Homebrew」は、macOS自体のパッケージマネージャです。
説明は割愛しますが、インストールは下記のコマンドで実行できます。

$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

参考

brew.sh

homebrewでnodebrewをインストール

改めて説明しますと、nodebrewはnodeのバージョン管理パッケージです。
まず、homebrewでnodebrewをインストールします。

$ brew update
$ brew install nodebrew

...

You need to manually run setup_dirs to create directories required by nodebrew:
  /usr/local/opt/nodebrew/bin/nodebrew setup_dirs

Add path:
  export PATH=$HOME/.nodebrew/current/bin:$PATH

To use Homebrew\'s directories rather than ~/.nodebrew add to your profile:
  export NODEBREW_ROOT=/usr/local/var/nodebrew


Bash completion has been installed to:
  /usr/local/etc/bash_completion.d

zsh completions have been installed to:
  /usr/local/share/zsh/site-functions
==> Summary
🍺  /usr/local/Cellar/nodebrew/0.9.8: 8 files, 38.3KB, built in 4 seconds

実行すると、インストール後の設定方法が表示されます。

nodebrewのバージョン管理ディレクトリ作成

バージョンを管理するためのディレクトリを作ります。
mkdirではなく、/usr/local/opt/nodebrew/bin/nodebrew setup_dirsから実行してください。

$ cd <ルートディレクトリ>
$ /usr/local/opt/nodebrew/bin/nodebrew setup_dirs
$ ls
...
.nodebrew
...

バージョンの管理ディレクトリにパスを通す

.bashrcのcurrentディレクトリにシンボリックリンクを貼る事で、任意のバージョンに変えているようです。
nodebrewのインストール時に表示された設定方法に沿って.bashrcに下記を設定します。

.bashrc

export PATH=$HOME/.nodebrew/current/bin:$PATH

nodebrewで最新版のnodeを再インストール

改めて、nodebrewで最新版のnodeをインストールします。

$ nodebrew install-binary latest
<nodeのパッケージのインストールが始まります。>
$ nodebrew list
v9.4.0

current: none

実行すると、v9.4.0(2018/1時点での最新版)がインストールされます。

このままだと、まだ使用するnodeが指定されていません。
次のコマンドで、最新版のnodeを有効にします。

$ nodebrew use <インストールしたバージョン>
$ node -v
v9.4.0

nodeのバージョンを確認すると、実行できている事が確認できます。
以上で、nodeの再インストールは終了です。



いかがでしたでしょうか?

nodeに慣れていなかった当時は、使うだけで手いっぱいで環境の整理はできていませんでした。
そのツケが今巡ってきたのかもしれません。

これを教訓に、理解せずツールを導入しないようにしないといけないと思う今日この頃です。

フロントエンドエンジニアのための現在とこれからの必須知識

フロントエンドエンジニアのための現在とこれからの必須知識