anyenvでnode.jsの異なるバージョンをディレクトリ別に切り替えてインストールする方法

githubのriywo/anyenv

最近React Nativeに触る機会が出来たので、開発環境の構築が必要になりました。
そのためにまずはnode.jsをインストールする必要があります。

nvmやnodebrewなど方法は色々ありますが、今回はanyenvを利用してnode.jsをMacOSにインストールしました。Linuxでも同様にインストールできます。

anyenvとは?

anyenvとは、ndenvやpyenv(node.jsやpythonのバージョン管理ツール)など、**env の開発環境をこれ一つで管理出来るツールです。

anyenvを使うメリットとして以下が挙げられます。

  • ディレクトリ毎に異なるバージョンのnode.jsをインストールすることが可能なので、案件毎に必要なバージョンに合わせて簡単に切り替えることができます。

  • インストールする言語が異なっていても同様の手順でバージョン管理ができるので、今回のnode.jsのインストール手順を覚えれば他の言語にも応用できます。

anyenvをインストールする

githubで公開されているので、cloneします。

$ git clone https://github.com/riywo/anyenv ~/.anyenv
$ ls -ld ~/.anyenv/
drwxr-xr-x  10 stedplay  _sophos  320 11 30 15:42 .anyenv/
$

README.mdにある通りに、profileファイルに設定を追記します。

$ echo 'export PATH="$HOME/.anyenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(anyenv init -)"' >> ~/.bash_profile
$ cat ~/.bash_profile
...省略...
export PATH="$HOME/.anyenv/bin:$PATH"
eval "$(anyenv init -)"
$

profileファイルを実行して、anyenv -v と打つとバージョン表示無しでanyenvと表示されれば、anyenvのインストールは完了しています。

$ source ~/.bash_profile
$ anyenv -v
anyenv
$

anyenvを使ってnode.jsをインストールする方法

ndenvをインストールする

node.jsが必要なので、それをバージョン管理できるndenvをインストールします(pythonの場合はpyenvになります)。

ndenvをインストールした後に、もう一度profileファイルを実行する必要があります。

$ anyenv install ndenv
$ source ~/.bash_profile
$ ndenv -v
ndenv 0.4.0-4-ga339097
$

指定したバージョンのnode.jsをインストールする

ndenv install -lでnode.jsのインストール可能なバージョンの一覧を確認できます。
私は今回8系の現時点で最新のv8.9.1をインストールすることにしました。

$ ndenv install -l | grep v8
...省略...
  v8.7.0
  v8.8.0
  v8.8.1
  v8.9.0
  v8.9.1
$

以下の「node.green」というページで、node.jsの各バージョンでどのような機能が実装されているかの対応表を確認することができます。

そして、この一覧からバージョンを選択してマシンにインストールします。これは使用可能なnode.jsのバージョンを追加する作業です。

ndenv versionsは過去にインストールした使用可能なバージョンの一覧を表示します。

$ ndenv install v8.9.1
$ ndenv versions
...省略...
  v8.7.0
  v8.9.1
$

特定のディレクトリで使用するnode.jsのバージョンを選択する

マシンに複数インストールされた使用可能なバージョンの中から、使用するバージョンを1つ選択する形です。
node.jsを実行したいディレクトリに移動して、ndenv local ${VERSION}を実行します。

nodeコマンドに加えて、npmコマンドも一緒にインストールされていて、このディレクトリ配下ならどこでも実行可能です。

$ mkdir /Users/stedplay/react-native
$ cd /Users/stedplay/react-native
$ ndenv local v8.9.1
$ node -v
v8.9.1
$ npm -v
5.5.1
$

ちなみに、選択したnode.jsのバージョンは.node-versionというファイルがこのディレクトリに生成され、保存されます。

案件間で異なるバージョンを使用する場合は、案件のディレクトリ毎にこのファイルの内容も異なると言うことです。

$ cat /Users/stedplay/react-native/.node-version 
v8.9.1
$

.node-versionが保存されるためには、ログインユーザにこのディレクトリの書き込み権限が有る必要があります。権限が無い場合は、chownコマンドで付与します。

任意のディレクトリで使用するnode.jsのバージョンを選択する

基本的に上記までの作業で事が足りますが、特定のディレクトリ内でのみnode.jsを使用する方法なので、例えばrootディレクトリに移動するとnodeコマンドは実行できません。場所関係なく同一のバージョンで実行して良い場合はndenv global ${VERSION}とすることで、任意のディレクトリで使用するデフォルトのバージョンを選択できます。

ここではv8.7.0を選択しました。

$ cd /
$ node -v
ndenv: node: command not found

The `node' command exists in these Node versions:
  v8.7.0
  v8.9.1

$ ndenv global v8.7.0
$ node -v
v8.7.0
$

ndenv globalで選択したnode.jsのバージョンは以下のパスに生成され、保存されます。

$ cat ~/.anyenv/envs/ndenv/version
v8.7.0
$

ちなみに、ndenv localで選択したバージョンはndenv globalより優先して採用されます。前述で作成したディレクトリに移動してnodeコマンドを実行すると、ndenv localで選択したバージョンで実行されます。

$ cd /Users/stedplay/react-native
$ node -v
v8.9.1
$

まとめ

anyenvを使って、「特定の」または「任意の」ディレクトリに指定したバージョンのnode.jsをインストールする方法をまとめました。

案件によっては限られたバージョンでしか動作保証されていないアプリケーションもあるので、このように簡単にディレクトリ毎にバージョンを切り替えられるのはとても楽です。

今回はnode.jsのみでしたが、他の言語でも同じフローで応用できそうなので、手間のかかる環境構築の手順が少しでもシンプルになるのは嬉しいです。