Edited at

anyenv + macOS環境構築

フルスタックで開発しているとphp、ruby、python、node.jsなど様々なプログラム言語を使用する機会が増えてきます。特に異なったプロジェクトを同一マシンで行おうとすると各プログラム言語のバージョンなどが競合して上手く開発が行えなくなります。

そこでanyenvの登場です。anyenvをインストールすることでメジャーどこの**env系を一括して管理できるようになりとても開発が楽になります。

追記:anyenv製作者のRyosuke IWANAGAさんが新たにanyenvのgithubリポジトリを作成されたので、記事を修正しました。

現時点でanyenvがサポートしている**env系は以下。

新リポジトリanyenv/anyenvになってから以前からインストールできる**env系の整理されたようです。

※以前はndenvを使用していたのですが、更新がnodenvの方が活発に開発されているので、これを機にndenvからnodenvに乗り換えようと思います。

■ 新anyenv(anyenv/anyenv)

- Renv: R

- crenv: Crystal ← 新規追加

- denv: D

- erlenv: Erlang

- exenv: Elixir

- goenv: GO

- hsenv: Haskell

- jenv: Java

- luaenv: Lua

- nodenv: Node.js ← ndenvがなくなっていますが、nodenvの方が開発が活発なためnodenvに統一されたのだと思われます。

- phpenv: PHP

- plenv: Perl

- pyenv: Python

- rbenv: Ruby

- sbtenv: Sbt

- scalaenv: Scala

- swiftenv: Swift

■ 旧anyenv(riywo/anyenv)

- rbenv: Ruby

- plenv: Perl

- phpenv: php

- ndenv: Node.js

- nodenv: Node.js

- denv: D

- jenv: java

- luaenv: Lua

- goenv: GO

- Renv: R

- erlenv: Erlang

- exenv: Elixir

- hsenv: Haskell

- nenv: Node.js/io.js

- sbtenv: sbt

- scalaenv: Scala

- swiftenv: Swift

かなりの**env系をサポートされています。「こんなに使わないからanyenv使うまでもないな」と思ってしまいがちですが、今後異なった言語を使う可能性がある場合はanyenvを導入するのをお勧めします。

というのもanyenvを導入する利点として、bashやzshなどにanyenvのパスを通すのみでその他は基本的にanyenv下で行ってくれるのでbash_profileなどがとてもきれいに保たれます。更にrbenv系を直接入れていたりするとndenvなど他のenv系をインストールしてbashなどにパスを通したところで上手くパスが通らないということが起こったりします。※個人的には以前この現象でかなりハマったので、それからanyenvを利用するようにしています。

前置きが長くなりましたが早速anyenvのインストールについて書いていきます。


anyenvのインストール

情報が古くなっている場合は本家のanyenvのインストールを参照してください。ここでは本家に習って記載したいと思います。


インストール

シェルはbashを使用する前提のコードです。


Homebrewでインストール

新たにmacOSユーザーはHomebrewからインストールできるようになっています。

$ brew install anyenv

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


githubのソースからインストール

Homebrewを使わず、従来どおりgithubのソースをダウンロードしてインストールも可能です。

1:$ git clone https://github.com/anyenv/anyenv ~/.anyenv

2:$ echo 'export PATH="$HOME/.anyenv/bin:$PATH"' >> ~/.bash_profile
3:$ echo 'eval "$(anyenv init -)"' >> ~/.bash_profile
4:$ exec $SHELL -l

たった四行でanyenvをインストールすることができました。

一応解説すると以下のようなことを行っています。


  • 1: ユーザーディレクトリ以下に.anyenvという名前でanyenvをgithubからクローン(ダウンロード)


  • 2: クローンした.anyenvにbashのパスを通す1:.bash_profileexport PATH="$HOME/.anyenv/bin:$PATH"を追加記述

  • 3: anyenvのパスをbashに通す2:.bash_profileeval "$(anyenv init -)"を追加記述

  • 4: .bash_profileの変更を有効にするためにSHELLを再起動

一応.bash_profileを確認してみましょう。

$ cd ~

$ cat .bash_profile

以下のようにanyenvのパスが.bash_profileに記述されています。

...

export PATH="$HOME/.anyenv/bin:$PATH"
eval "$(anyenv init -)"
...


旧 riywo/anyenv から anyenv/anyenv への以降

旧 riywo/anyenvから新たな anyenv/anyenvへの以降は以下のコードでmigrateできるようです。

※自分の使っていたndenvがanyenv install -lで外れていたので少々環境を変更する必要がある方もいると思われますので、慎重に行ってください。 新たにanyenvをanyenv/anyenvからインストールする方はここは飛ばして問題ありません。

$ cd ~/.anyenv

$ git pull
$ git remote set-url origin https://github.com/anyenv/anyenv.git


インストールのマニフェストディレクトリ

/User/[your_account]/.config/anyenv/anyenv-installにインストールのマニフェストを格納?できるようになっているようです。公式サイトに習って実行してみます。

上記の/User/[your_account]/.config/anyenv/anyenv-installの「ディレクトリが存在しません、checkout しますか?」と聞かれるので「y」でcheckoutします。

$ anyenv install --init

Manifest directory doesn't exist: /Users/[your_account]/.config/anyenv/anyenv-install
Do you want to checkout ? [y/N]: y
Cloning https://github.com/anyenv/anyenv-install.git master to /Users/[your_account]/.config/anyenv/anyenv-install...
Cloning into '
/Users/[your_account]/.config/anyenv/anyenv-install'...
remote: Enumerating objects: 44, done.
remote: Counting objects: 100% (44/44), done.
remote: Compressing objects: 100% (39/39), done.
remote: Total 44 (delta 1), reused 43 (delta 1), pack-reused 0
Unpacking objects: 100% (44/44), done.

※旧anyenvから移行した人は、この状態でanyenv versionsとコマンドを打っても/User/...: ndenv: command not foundと以前インストールした**env系のコマンドが見つかりませんと言われますが、シェルを再起動すれば問題ありません。

$ exec $SHELL -l

この後にanyenvでインストールした**env系のバージョンを確認してみます。

$ anyenv versions

ndenv:
v10.10.0
v6.10.0
v6.14.4
v6.2.2
v7.10.0
v7.2.0
v7.9.0
v8.10.0
* v8.11.1 (set by /Users/[your_account]/.anyenv/envs/ndenv/version)
v8.11.3
v8.12.0
v9.9.0

新anyenvのanyenv install -lでは出ていなかったndenvですが、旧anyenvでインストールしたものはどうやらインストールされた状態のようです。

※ただ、ndenvは開発があまり活発ではないため、新anyenvに切り替えた機にnodenvに乗り換えようと思います。


anyenvのPluginのインストール

上記でanyenvを利用して**env系のインストール準備はできていますが、anyenvで入れた**env系のアップデートなどを一括でアップデートしてくれるなど、後々便利になってくるプラグインを初回からインストールしておきます。

追記:znz/anyenv-updateznz/anyenv-gitのプラグインのgithubページをみると、anyenvのリンク先が一見、旧anyenv(riywo/anyenv)のリンクのようですが、新anyenv(anyenv/anyenv)のページにリダイレクトされているかつ、anyenvの公式ページのPluginsでリンクが貼られているので互換性があるようです。なので、Pluginをインストールしていきます。


anyenvのプラグインをインストールする「plugins」ディレクトリの作成

今回はanyenv-updateプラグインとanyenv-gitプラグインの2つをインストールするので、先にそれらのプラグインをインストールする「plugins」ディレクトリを.anyenv以下に作成しておきます。

$ mkdir -p ~/.anyenv/plugins


anyenv-updateプラグインのインストール

anyenv updateコマンドでanyenvで入れた**env系の全てをアップデートしてくれるプラグインです。

$ git clone https://github.com/znz/anyenv-update.git ~/.anyenv/plugins/anyenv-update


anyenv-gitプラグインのインストール

anyenv gitコマンドでanyenvで入れた**env系の全てのgitコマンドを実行するプラグインです。

$ git clone https://github.com/znz/anyenv-git.git ~/.anyenv/plugins/anyenv-git


anyenv-gitの使い方

※情報が古い場合はanyenv-gitの本家を確認して見てください。



  • $ anyenv git pull: anyenvでインストールした全ての**env系とインストールされているプラグインのアップデート


  • $ anyenv git gc: ガーベージコレクション(お掃除)


  • $ anyenv git remote -v: 全てのリモートリポジトリを表示


  • $ anyenv git status: gitのステータス表示

以上でanyenvのインストールおよびanyenvを快適に使用するプラグインのインストールは完了です。


anyenvの使い方


anyenvでインストールできる**env系のリストを表示

anyenvでは**env系のサポートが増えることが有るので以下のコマンドでインストールできる**env系のリストを表示して確認することができます。

$ anyenv install -l


**env系のインストール

今回はnodeのバージョン管理を行うnodenvをインストールしてみます。

コマンドは以下

以下ndenvで説明していますが、新anyenvではnodenvをサポートしているのでnodenvに読み替えてください。

↑以前は上記のようにndenvでこれより下の記事で説明を書いていましたが、nodenvに書き換え修正しました。

※記事の中でも数回触れていますがndenvよりnodenvの方が開発が活発なため、個人的にはnodenvを使用することをお勧めします。

$ anyenv install nodenv

anyenvでインストールしたnodenvを有効にするため、シェルの再起動をします。

$ exec $SHELL -l


インストールした**env系のバージョンの確認

以下のコマンドでanyenvでインストールした**env系のバージョンを確認することができます。

$ anyenv versions

nodenv:
Warning: no Node detected on the system

anyenvでnodenv自体をインストールしましたが、nodenvで管理するnodeをインストールしていないので上記のようにエラーが出力されます。

なので次にnodenvを使ってnodeをインストールしていきます。


**env系にインストールできるバージョンの確認

anyenvで**env系をインストールした時点では上記のようにsystemに準拠したバージョンが指定されているので**env系に新たにインストールできるバージョンの確認を以下のコマンドで表示できます。

以下はnodenvの例です。

※ndenvの場合はv8.10.0でnodenvの場合は8.10.0で頭文字にvがつきません。ndenvからnodenvに移行された方でndenv local v8.10.0などで.node-versionを生成している場合は、このあたり要注意です。

$ nodenv install -l

..中略..
8.10.0
8.11.0
8.11.1
8.11.2
8.11.3
8.11.4
8.12.0
8.13.0
8.14.0
8.14.1
8.15.0
..中略..


**env系に異なるバージョンのインストール

上記でインストールできるバージョンを確認できたら、インストールしたいバージョンを以下のコマンドで指定してインストールすることができます。

※nodenvの例で6.10.08.10.0の2つをインストールしてみます。8系はlambda、firebase functionsなどで対応されたためasync/awaitが使えて便利です。

$ nodenv install 6.10.0

$ nodenv install 8.10.0

新しい**env系をインストールをした後はbash(shell)の再起動を忘れずに行っておきましょう

$ exec $SHELL -l

ここで一旦**env系がインストールされているか確認してみましょう。以下のように指定したバージョンが表示されていれば無事成功です。

$ anyenv versions

nodenv:
6.10.0
8.10.0

各バージョンのnodeがnodenvによってインストールできていますが、nodenv globalを設定していないので*マークが付いていません。この状態でnodeコマンドを実行しても、どのバージョンのnodeを使用するのかシステム側は不明なのでエラーとなります。

では次にglobalを設定してシステムのデフォルトのバージョンを指定していきます。


インストールされている**env系のバージョンを変更

では実際に**envのバージョンを変更してみます。グローバルに変更すればシステムの全てのバージョンが指定したものに切り替わります。またグローバルは変更せずに特定のプロジェクト(ディレクトリ以下)で指定のバージョンを使用したいときにはローカルでバージョンを変更することも可能です。


グローバルの設定・変更

$ nodenv global 8.10.0

くどいですが、変更されているか確認してみます。

$ anyenv versions

nodenv:
6.10.0
* 8.10.0 (set by /Users/xxxx/.anyenv/envs/nodenv/version)

8.10.0の先頭にアスタリスクがついて無事globalとして設定・変更されています。


ローカルで変更

ではローカルで異なるバージョンを使えるようにしてみましょう。ここでは仮にtestdirを制作して、そこに上記で設定した6.10.0の環境を有効にしてみます。

$ mkdir testdir

$ cd testdir
$ nodenv local 6.10.0

ここでも確認してみます。

$ anyenv versions

nodenv:
* 6.10.0 (set by /Users/xxxx/Desktop/testdir/.node-version)
8.10.0

無事設定されています。グローバルは変更されていませんので、指定のローカルディレクトリ下以外ではグローバルで設定した8.10.0が有効になっています。またset byの後のパスがローカルで指定したディレクトリに制作された.node-versionになっています。

vagrant + virtualboxなどの仮想サーバーを構築した際にVagrantfileconfig.vm.synced_folderでシンクロナイズするフォルダに.node-versionを参照しておくと、仮想開発環境のサーバーを動かしつつ、ホスト側でgulpないしはwebpackなどでbrowserSyncを利用する時にnodeのバージョンが統一できて重宝します。


まとめ

ざっくりとですがanyenvのインストールと使い方を記載させてもらいました。いろいろな**env系が混在する開発環境ではかなり便利に使い分けることができるようになるので大変助かっております。anyenv製作者のRyosuke IWANAGAさんに感謝です。