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です。

シェルを確認する

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

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

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

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

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

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

初期設定を行うコマンド

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

シェルを再起動する

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

anyenvを使おう

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

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

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

anyenvからnodenvをインストール

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

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

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

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

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

表示は次の通りです。

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

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

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

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

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

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

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

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

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

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

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

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

目的のバージョンがインストールできない場合
nodenvインストール当時の最新バージョンよりも新しいバージョンがnodenv install -lで出現しない場合があります。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

終わりに

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