OSX上のpyenv/ndenvをanyenvにまとめた、direnvは試してない


前回（かなり前）書いた[Macでpyenv+virtualenv](http://qiita.com/maosanhioro/items/47a52f96fefba7126f9b)に続いて、ndenv環境も使ってて、あーそういえばと思ってanyenvにまとめたメモです。
諸先輩エントリとかぶってる恒例はお許しください。

*env系の特徴/メリットは、

1. OSX上にそのまま構築して汚染したくない
1. でもプロジェクトなりバージョンなりの違いによる複数環境ほしい
1. けどVirtualBox/Vagrant等でがんばりたくない

というわがままを$HOME以下にまるくおさめることで解決を試みるいいものだと個人的には思います。

# 環境
* OSX 10.9.3

# anyenv
## インストール
※既存の*envとかあれば削除しておきます。

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

## 設定
.bashrcとか.zshrcとかそのあたりに

	# anyenv
	if [ -d $HOME/.anyenv ] ; then
		export PATH="$HOME/.anyenv/bin:$PATH"
		eval "$(anyenv init -)"
		# tmux対応
		for D in `\ls $HOME/.anyenv/envs`
		do
			export PATH="$HOME/.anyenv/envs/$D/shims:$PATH"
		done
	fi

tmux対応と銘打ってる箇所、`ls`で環境探してますが、私は下記のようなエイリアス貼ってるので、コマンド名にバックスラッシュつけて、このときだけエイリアスを無効化してます。

こうしないと私の場合、エイリアスが先に定義される順序になってて、`echo $PATH`が大惨事になってたので。

	$ alias ls
	ls='ls -alG'

最後に一応シェルを再起動しておきます。

	$ exec $SHELL -l

## プラグインインストール
*envのupdateプラグインもインストールしておくことにしました。

	$ mkdir -p $(anyenv root)/plugins
	$ git clone https://github.com/znz/anyenv-update.git $(anyenv root)/plugins/anyenv-update

アップデート方法は

	$ anyenv update

## 使い方
*envっていうけど具体的にどれが網羅されているのでしょう。

```bash
$ anyenv install -l
Available **envs:
  Renv
  crenv
  denv
  erlenv
  exenv
  goenv
  hsenv
  jenv
  luaenv
  ndenv
  nenv
  nodenv
  phpenv
  plenv
  pyenv
  rbenv
  sbtenv
  scalaenv
```
だそうです。
ひとまずPythonとNode.jsの環境があればいいので、

	$ anyenv install pyenv
	$ anyenv install ndenv
	$ exec $SHELL -l

これで*env環境そろったので、各言語の必要バージョンをインストールしていきます。ここではなんとなくそれぞれ2バージョンくらい。

	$ pyenv install 2.7.7
	$ pyenv install 3.4.1
	$ ndenv install 0.10.29
	$ ndenv install 0.11.13

	$ anyenv versions
	ndenv:
	  0.10.29
	  0.11.13
	pyenv:
	* system (set by ~/.anyenv/envs/pyenv/version)
	  2.7.7
	  3.4.1

pyenv/ndenvそれぞれマルチバージョン環境ができました。

あとはサブコマンドglobal/localを使ってそれぞれ適用する範囲を決めていけばいいのかなと。
ひとまずシステムワイドだけ宣言しちゃいます。

	$ pyenv global 2.7.7; ndenv global 0.10.29
	$ anyenv versions
	ndenv:
	* 0.10.29 (set by ~/.anyenv/envs/ndenv/version)
	  0.11.13
	pyenv:
	  system
	* 2.7.7 (set by ~/.anyenv/envs/pyenv/version)
	  3.4.1

pipやnpmも大丈夫。

	$ which pip npm
	~/.anyenv/envs/pyenv/shims/pip
	~/.anyenv/envs/ndenv/shims/npm

今回メモしたかった主内容はこれでおしまいです。


## [おまけ]pyenv-virtualenvは？
[Macでpyenv+virtualenv](http://qiita.com/maosanhioro/items/47a52f96fefba7126f9b)のようにHomebrew経由でインストールするのと違うので、[yyuu/pyenv-virtualenv](https://github.com/yyuu/pyenv-virtualenv)を直接インストールします。

	$ git clone https://github.com/yyuu/pyenv-virtualenv.git ~/.anyenv/envs/pyenv/plugins/pyenv-virtualenv
	$ exec $SHELL -l

使えるようになりました。

	$ pyenv virtualenv --version
	pyenv-virtualenv 20140615 (virtualenv unknown)

## [おまけ]ndenvのvirtualenv相当のものは？
npmが元々-gオプション有りでシステムワイド、無しでディレクトリ単位で構築という方法取れるので、これでいいかなと。
環境コピー、よりは少し手間ですけど、少しなので今回は妥協です。

# 感想
## anyenv
一度覚えた*env系コマンドほぼそのまま使い回せるのでなんら苦労なく入り込めました。数も少ないですし。
しかしphpenvだけは腰が重い・・・

## direnv
わざわざお題に書いて己を煽ってみたものの、[direnv](https://github.com/zimbatm/direnv)は結局試せてません。
ディレクトリ個別に環境変数を持つものらしく、`cd`するたびに発動はかっこいい。

推測込みの個人感ですが、両者の得意とする領域が微妙に違っていて、比較とか無理っぽいです。
[anyenv](https://github.com/riywo/anyenv)はマルチバージョン構築という目的特化
[direnv](https://github.com/zimbatm/direnv)は環境変数操作という汎用性
「環境変数」という共通項が包括関係にあるだけで別物だ、と個人的には思いました。


# 参考
* [riywo/anyenv](https://github.com/riywo/anyenv)
* [znz/anyenv-update](https://github.com/znz/anyenv-update)
* [yyuu/pyenv-virtualenv](https://github.com/yyuu/pyenv-virtualenv)
* [zimbatm/direnv](https://github.com/zimbatm/direnv)