Node.jsは開発環境によって異なるバージョンを求められることがあります。この記事ではNode.jsに限らず他の言語でもバージョン管理ができる「anyenv」を使った環境構築を行います。

この記事で取り扱う内容は以下の通りです。

  • anyenvのインストール
  • nodenvのインストール
  • Node.jsのインストール/設定/プロジェクトごとのバージョン指定

Node.jsはバージョン管理が必要

バージョンによって動作しないアプリケーションがある場合、バージョンを固定して不用意なエラーを回避します。しかし、アップデートによる新機能や動作の高速化は魅力的。せめてプロジェクト外では使ってみたい場合に、面倒な再インストール作業が頭をよぎります。これらを回避するために、瞬時にバージョンを切りかえられるanyenvを使用するのです。

例えば、Node.jsでLibSassを動かすためのライブラリ「node-sass」は、v4.5.2の時点ではNode v8でのインストールエラーが発生していました。 これは、Node v8からのインストール要求に対応するバージョンが設定されていないことによりました。現在はv4.5.3にアップデートされ、この問題は解決しています。このような問題は他のパッケージでも十分起こりうることです。メンテナンスが追従するかどうかはそのパッケージの開発状況により、長くアップデートされてないほどこの問題は起こります。

このような問題を回避するためには、プロジェクトごとに安定するバージョンで固定します。 開発にかかわる人には「このバージョンのNode.jsを使ってください」と伝えてインストールしてもらいます。そうすれば、インストールができないという問題も回避でき、開発がスムーズにはじめられます。

しかし、Node.jsのインストールは環境全体に影響するものです。 たとえば、上記の例をうけてプロジェクトAで使うNode.jsのバージョンをv7系で固定していたとしましょう。その際に、新しくたちあげるプロジェクトBにおいてv8系を使いたい場合は、アップデートが必要です。しかし、プロジェクトAの業務の際は、またv7系に戻さなければなりません。この際にインストール作業をその都度繰り返すのは手間です。

Node.jsを複数バージョン保持しておき、それをコマンドひとつで切り替えられるのがanyenvです。 正確には、anyenvの中で動作するnodenvというソフトウェアです。nodenvの他にも、Rubyのバージョン管理をするrbenvやPythonのバージョン管理をするpyenvなどがあります。これらを包括的に管理する存在がanyenvです。anyenvの設定さえしておけば、他の**env系の設定をする必要はありません。もしそれぞれ使用する場合、それぞれの設定が必要ですが、それらをまとめて管理してくれます。複数の言語をつかって開発をする場合に大きな力を発揮しますが、現時点でその予定がなくても今後に見据えて使用することをおすすめします。

anyenvをインストールしよう

anyenvはanyenv専用のディレクトリを作り、そこにアクセスするという形で使います。 通常、インストーラをつかってNode.jsをインストールする際につかう領域を侵すことはありません。共同作業者の環境を汚染することを強制しないということも、anyenvのいいところのひとつです。手順は4つです。

  • anyenvをダウンロードしてくる
  • シェルを確認する
  • PATHを通すためのコマンドを設定ファイルに書く
  • シェルを再起動する

anyenvをダウンロードしてくる

まずはanyenvをGitHubからダウンロードしましょう。 さきほど「新たに作り」と言いましたが、あらかじめ存在するものをダウンロードしてくれば完了です。必要なファイルはGitHub上に存在します。ダウンロード先は、ホームディレクトリの直下です。不用意に削除してしまったりすることを防ぐために、隠しディレクトリとしてダウンロードします。clone先の指定は、リポジトリ名のあとに半角スペースをあけてパスを記述すればOKです。


git clone https://github.com/riywo/anyenv ~/.anyenv

シェルを確認する

使っているシェルの種類によって設定を書くファイルは異なります。 シェルとはターミナルの中で動いているソフトウェアで、OSにアクセスするためのものです。Macのデフォルトのシェルはbashで、その場合は、~/.bash_profileに記述します。zshをお使いの場合は/.zsh_profileです。何を使っているかわからない場合は、次のコマンドで確認できます。このコマンドは確認のみを行うもので、わかっている場合は飛ばしてもかまいません。


echo $SHELL

たとえばbashを使っている場合は次のように表示されます。


/usr/local/bin/bash

PATHを通すためのコマンドを設定ファイルに書く

PATHを通すというのは、簡単にいうと「その都度場所を指定しなくても、プログラム名だけで起動できるようにあらかじめ場所を書いておく」というものです。 そのためには、シェルの設定ファイルに「シェルでログインするときに、PATHを通すためのコマンドを真っ先に呼び出す」という記述をします。PATHを通すコマンドは「初期設定の際に使う変数を設定するコマンド」と「初期設定を行うコマンド」の2つありますので、それぞれ登録します。

初期設定の際に使う変数を設定するコマンド

PATHという変数にディレクトリ名を格納します。この変数が、実際の初期設定で使われます。


echo 'export PATH="$HOME/.anyenv/bin:$PATH"' >> ~/.bash_profile

初期設定を行うコマンド

先ほどの変数を踏まえ、実際に初期設定を行うコマンドです。環境変数はログインするたびに設定を行う必要があるので、ログインするたびにこのコマンドが呼び出されます。一度行われたらもう削除していいわけではありません。


echo 'eval "$(anyenv init -)"' >> ~/.bash_profile

シェルを再起動する

設定が完了したら、シェルを再起動します。 シェルが行っているのはOSへのログインなので、再ログインといったほう正確ですが、わかりやすいように再起動とします。ここでその都度ターミナルを立ち上げなおす必要はありません。次のコマンドで再ログインできます。このログインの際に、先ほど記述した設定ファイルが読み込まれ、anyenvが使えるようになります。


exec $SHELL -l

anyenvを使おう

実際にanyenvを使ってみましょう。ここで行う作業は次の通りです。

  • anyenvからnodenv(Node.jsの管理ツール)をインストール
  • nodenvからNode.jsをインストール
  • 使うバージョンを設定する(システム全体)
  • 使うバージョンを設定する(プロジェクトごと)

これで、Node.jsのバージョン管理を行う環境が整います。

anyenvからnodenvをインストール

anyenvコマンドを使うと、各種コマンドが表示されます。 操作に迷った時も、まずはanyenvコマンドを使いましょう。


anyenv

このような表示がされます。簡易的なREADMEです。


anyenv
Usage: anyenv  []

Some useful anyenv commands are:
   commands            List all available anyenv commands
   local               Show the local application-specific Any version
   global              Show the global Any version
   install             Install a **env
   uninstall           Uninstall a specific **anv
   version             Show the current Any version and its origin
   versions            List all Any versions available to **env

See `anyenv help ' for information on a specific command.
For full documentation, see: https://github.com/riywo/anyenv#readme

表示に従い、installコマンドを使って**envがインストールしてみましょう。


anyenv install

anyenv installコマンドの使い方と、オプションが表示されます。


Usage: anyenv install [-f|--force] <**env>
       anyenv install -l|--list

  -l/--list          List all available **envs
  -f/--force         Install even if the **env appears to be installed already
  -s/--skip-existing Skip if the version appears to be installed already

--lもしくは--listを付与すると、インストールできる**envのリストが表示されるようです。実際にやってみましょう。


anyenv install --list

表示は次の通りです。


Available **envs:
  Renv
  crenv
  denv
  erlenv
  exenv
  goenv
  hsenv
  jenv
  luaenv
  ndenv
  nenv
  nodenv
  phpenv
  plenv
  pyenv
  rbenv
  sbtenv
  scalaenv
  swiftenv

かなりいろいろありますが、今回はnodenvをインストールします。もともとRubyのためのrbenvのみが存在していて、他の**envはその派生として作られたものです。そのため、Node.jsに関してはndenvnenvなど複数の管理システムが存在します。ndenvの情報が散見されますが、ここではアクティブなメンテナが多数存在していて現在も継続的にメンテナンスされているnodenvを採用します。ではnodenvをインストールしましょう。


anyenv install nodenv

いくつかの出力のあとに、再起動を促すメッセージが表示されます。


Install nodenv succeeded!
Please reload your profile (exec $SHELL -l) or open a new session.

メッセージに従い、シェルを再起動しましょう。先ほどと同様execコマンドを使います。これでnodenvのインストールは完了です。


exec $SHELL -l

nodenvからNode.jsをインストール

nodenvを使って、Node.jsをインストールします。

まずは、nodenvコマンドを使ってみましょう。


nodenv

すると、anyenvと同じように使えるコマンドの説明が出力されます。


Usage: nodenv  []

Some useful nodenv commands are:
   commands    List all available nodenv commands
   local       Set or show the local application-specific Node version
   global      Set or show the global Node version
   shell       Set or show the shell-specific Node version
   install     Install a Node version using node-build
   uninstall   Uninstall a specific Node version
   rehash      Rehash nodenv shims (run this after installing executables)
   version     Show the current Node version and its origin
   versions    List all Node versions available to nodenv
   which       Display the full path to an executable
   whence      List all Node versions that contain the given executable

See `nodenv help ' for information on a specific command.
For full documentation, see: https://github.com/nodenv/nodenv#readme

インストールにはinstallコマンドを使うと表示されているので、installコマンドを使いましょう。


nodenv install

installコマンドの説明が表示されます。


Usage: nodenv install [-f|-s] [-kpv] 
       nodenv install [-f|-s] [-kpv] 
       nodenv install -l|--list
       nodenv install --version

  -l/--list          List all available versions
  -f/--force         Install even if the version appears to be installed already
  -s/--skip-existing Skip if the version appears to be installed already

  node-build options:

  -c/--compile       Force compilation even if a matching binary exists
  -k/--keep          Keep source tree in $NODENV_BUILD_ROOT after installation
                     (defaults to $NODENV_ROOT/sources)
  -p/--patch         Apply a patch from stdin before building
  -v/--verbose       Verbose mode: print compilation status to stdout
  --version          Show version of node-build

For detailed information on installing Node versions with
node-build, including a list of environment variables for adjusting
compilation, see: https://github.com/nodenv/node-build#usage

インストールできるバージョンは--listをつけることで表示できます。2017年11月1日現在ではv8.9.0が安定版となっていますので、安定版をダウンロードします。


nodenv install 8.9.0

Installed node-v8.9.0-darwin-x64 to ...のように表示されたら完了です。現在インストールされているバージョンを確認してみましょう。


nodenv versions

現在インストールされているバージョンが表示されます。さきほどインストールしたv8.9.0があることを確認できました。


* system (set by /Users/nayucolony/.anyenv/envs/nodenv/version)
  8.9.0
目的のバージョンがインストールできない場合
nodenvインストール当時の最新バージョンよりも新しいバージョンがnodenv install -lで出現しない場合があります。

node-build: definition not found: 8.9.0

See all available versions with `nodenv install --list'.

If the version you need is missing, try upgrading node-build:

  cd /Users/XXXXXX/.anyenv/envs/nodenv/plugins/node-build && git pull && cd -


その場合、表示の通りにコマンドを実行してください。(XXXXXXの部分は環境によって変わりますので確認してください)

cd /Users/XXXXXX/.anyenv/envs/nodenv/plugins/node-build && git pull && cd -


これで、目的のバージョンがインストール可能なバージョンにリストアップされます。

使うバージョンを設定する(システム全体)

現時点ではインストールされているのみで、有効にはなっていません。 まずは、システム全体で使うバージョンを設定してみましょう。ここではglobalコマンドを使って8.9.0を設定します。指定できるバージョンは、nodenv versionsコマンドをつかって確認した通り、インストールされたバージョンのみです。


nodenv global 8.9.0

完了しても特に反応はありませんが、設定は書き換わっています。新しく設定を読み込むために、シェルを再起動しましょう。


exec $SHELL -l

Node.jsのバージョンを確認します。


node -v

設定されたバージョンがっ表示されます。以前にnodenvではなくインストーラなどをつかってインストールしたことがある場合も、バージョンが切り替わります。今回は次のように表示されます。これで、Node.jsのインストールから設定までが完了しました。


v8.9.0

使うバージョンを設定する(プロジェクトごと)

さて、現在はグローバルにv8.9.0がインストールされており、指定のない限りはv8.9.0で動きます。例えばパッケージの都合などで最新版のv9.0.0を必要とする場合があります。プロジェクトごとにバージョンを指定し、その作業ディレクトリでは自動で指定したバージョンが設定されるようにしてみます。

まず、任意のNode.jsをインストールします。 現時点ではv8.9.0がインストールされていますので、つづいて執筆時点の最新版v9.0.0をインストールしてみましょう。コマンドは先ほど同様にinstallを使います。


nodenv install 9.0.0

次に、ホームディレクトリに移動します。 今回はホームディレクトリ直下に適当なディレクトリをつくりましたが、実際は既存のプロジェクトになるでしょう。cdコマンドで移動します。


cd ~/anyenv-sample

localコマンドを使用して、設定ファイルを生成します。


nodenv local 9.0.0

完了すると、.node-versionというファイルが作られます。 使用するバージョンが書かれているだけのファイルですが、nodenvはこのファイルを検出した場合そのバージョンのNode.jsを使用するように切り替えます。先頭に.のつくファイルは隠しファイルとして扱われるので、finderなどでみる場合は表示されていない場合があります。その場合は⌘ + shift + .で表示/非表示を切り替えることができます。

設定が有効になっているか確認しましょう。


node -v

指定したバージョンになっていればOKです。もし既存プロジェクトなどで最初から.node-versionファイルがある場合は、そのバージョンをインストールしておきましょう。インストールされてない場合は指定したバージョンに切り替えることができません。


v9.0.0

これがこのディレクトリのみで有効なバージョンであることを確認するために、いったんcdコマンドでホームディレクトリに戻ります。


cd

バージョンを確認してみましょう。


node -v

nodenv globalに設定されたバージョンであればOKです。ここでは先ほど設定したv8.9.0に切り替わっています。


v8.9.0

終わりに

以上で、anyenvをつかったNode.jsのバージョン管理をするための環境が整いました。この記事の内容で基本的には事足りますが、他の操作が必要になった場合もanyenvコマンドから使用方法を呼び出すことで対応していきましょう。
また、チュートリアルなどでいきなりコマンドにオプション付きで紹介されているものを使うことも多いでしょうが、コマンド単体で起動してみると気づかなかった機能に気づくことがあります。ぜひ試して見てください。