anyenvでモダンな開発環境構築。PHP,NodeJS,Ruby,Perl,Python

anyenvからndenv,pyenv,plenv,rbenv,phpenvとかとりあえず入れてphpenvの設定をしてみる。

##ポイント

phpenvを単体で入れる場合rbenvとのパスの関係がめんどくさいし、単体で入れているとパスがごちゃごちゃしてきてめんどくさい人は是非ためしてください。

また、Homebrewで各envをもともと入れている人は消しておいてください。


今回はMacで開発環境を整えていくため、まずはHomebrewとanyenvをインストールしてきます。linuxの場合はyum又はapt-getなど。
とりあえずHomebrewをインストール→本家http://brew.sh/index_ja.html

```homebrew_install
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```
##Apacheを入れてphpの動作確認を取りたいのでApacheインストール。

```
$ brew tap homebrew/dupes
$ brew tap homebrew/apache

$ brew search httpd

$ brew install httpd24

# 次のようになっていることを確認
$ which apachectl
/usr/local/bin/apachectl
```

ここまで書いてしまったのでApacheの簡単な設定も少々


```/usr/local/etc/apache2/2.4/httpd.conf
# 使用するポート番号の設定
# localhost/で繋ぎたいので、80ポートにする
Listen 80

# ServerNameの設定
# 上でポート番号を80にしたので、ここも80にする
ServerName localhost:80

# DocumentRootの変更
DocumentRoot "/Users/ユーザ名/フォルダ名"

# .htaccessでURLのoverwriteを許可 （<Directory "/Users/furudate/htdocs">内）
AllowOverride All

# index.phpを使えるように修正 (IfModule dir_module内)
DirectoryIndex index.php index.html

# .phpを実行できるようにMIMEタイプを追加 (IfModule mime_module内)
AddType application/x-httpd-php .php

# バーチャルホストを利用できるようにコメントアウトを解除
Include /usr/local/etc/apache2/2.4/extra/httpd-vhosts.conf

```

```/usr/local/etc/apache2/2.4/extra/httpd-vhosts.conf
#
# Use name-based virtual hosting.
#
# NameVirtualHost *:80 (Apache2.4からはこの記述いらないみたい。一応コメントとして残しておきます）

<VirtualHost *:80>
    ServerName sample.local
    DocumentRoot /Users/ユーザ名/httpd.confで指定したフォルダ名
    DirectoryIndex index.php index.html

    <Directory "/Users/ユーザ名/httpd.confで指定したフォルダ名">
        AllowOverride All
        Allow from All
    </Directory>
</VirtualHost>

#
# VirtualHost example:
# Almost any Apache directive may go into a VirtualHost container.
# The first VirtualHost section is used for all requests that do not
# match a ServerName or ServerAlias in any <VirtualHost> block.
#
#<VirtualHost *:8080>
#    ServerAdmin webmaster@dummy-host.example.com
#    DocumentRoot "/usr/local/opt/httpd22/docs/dummy-host.example.com"
#    ServerName dummy-host.example.com
#    ServerAlias www.dummy-host.example.com
#    ErrorLog "/usr/local/var/log/apache2/dummy-host.example.com-error_log"
#    CustomLog "/usr/local/var/log/apache2/dummy-host.example.com-access_log" common
#</VirtualHost>

#<VirtualHost *:8080>
#    ServerAdmin webmaster@dummy-host2.example.com
#    DocumentRoot "/usr/local/opt/httpd22/docs/dummy-host2.example.com"
#    ServerName dummy-host2.example.com
#    ErrorLog "/usr/local/var/log/apache2/dummy-host2.example.com-error_log"
#    CustomLog "/usr/local/var/log/apache2/dummy-host2.example.com-access_log" common
#</VirtualHost>
```

ここまでで、ドキュメントルート（上記の場合は /User/ユーザ名/お好きなフォルダ名）に設定したディレクトリにindex.htmlを置き、localhostにアクセスしてみて中身が見れたらOKです。

```Apache起動
$ sudo apachectl start
```


もし見れない場合は以下のコマンドでApacheの状態を見てみましょう。
エラー文表示の場合対策してからもう一度ためしてみてください。

```
$ apachectl -t
```


##anyenvインストール
さて、いよいよ本題のanyenvインストールです。
最新版→https://github.com/riywo/anyenv


```anyenvインストール
$ git clone https://github.com/riywo/anyenv ~/.anyenv
```
ここでパスを通します。

```bashrc
$vim .bashrc

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
```
最後にShellを再起動しておきます。

```
$ exec $SHELL -l
```

入ったかの確認

```
$ which anyenv
~/.anyenv/bin/anyenv
```


それではインストールしていきましょう。

```
$ anyenv install plenv
$ anyenv install pyenv
$ anyenv install rbenv
$ anyenv install phpenv
$ anyenv install ndenv
```
インストールができているか一応確認。

```初期状態確認コマンド
$ anyenv versions
```

anyenvは自動的にupdateコマンドができないのでこれもインストール
最新版→[anyenv-update](https://github.com/riywo/anyenv)


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

とりあえずこれで使えるが時間がある人は次の2つをやってみてください。
最新版→[anyenv-exec](https://github.com/aereal/anyenv-exec)
最新版→[anyenv-git](https://github.com/znz/anyenv-git)



```any-exec
$ mkdir -p $(anyenv root)/plugins
$ git clone git://github.com/aereal/anyenv-exec.git $(anyenv root)/plugins/anyenv-exe
$ anyenv --version
```

僕がやった時はexecが何故か入らなかった。


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

***

さて、ここからphpenvを設定していこうとおもいます。

```
$ phpenv install
```

バージョンが沢山出ると思うのでとりあえず一番新しい物をインストール

```
$ phpenv install 5.6.9
```
インストールできたか確認
このコマンドで先ほど入れたバージョンが表示されればOK

```
$ phpenv versions
```
PHP のバージョンを切り替えるには、phpenv global コマンドを実行します。

```
$ phpenv global 5.6.9
```
これで、php のバージョンが 5.6.9 になったか確認。

```
$ php -v
```

デフォルトに戻したい場合はsystemをglobalコマンドで指定

***

###Apache module のインストール
phpenv install を実行したときに、Apache のモジュールもインストールされるように設定します。まず、次のようにファイルを編集して、PHP のビルドオプションに --with-apxs2 を追加します。

```~/.anyenv/envs/phpenv/plugins/php-build/share/php-build/default_configure_options
--with-apxs2=/usr/sbin/apxs
```

これで libphp5.so が作られるようになりますが、現在の php-build には問題があり、この状態でビルドすると libphp5.so を デフォルトの/etc/httpd/modules に出力してしまうらしいのでパッチをあてます。
<b>ここ重要！！！<b>

``` php-build修正パッチ
$ cd ~/.anyenv/envs/phpenv/plugins/php-build/bin
$ curl https://gist.githubusercontent.com/tkuchiki/10112836/raw/php-build.patch | patch -u php-build -
```

phpenv install すると、たとえば 5.6.9 であれば以下の場所に libphp5.so が出力されるようになります。

```
~/.anyenv/envs/phpenv/versions/5.6.9/libexec/libphp5.so
```

phpenv global で環境を切り替えると、指定したバージョンの libphp5.so へのシンボリックリンクが以下の場所に作成されます。これを LoadModule で指定することで、Apache 側の設定を変更せずに PHP のバージョン切り替えを反映させられる。

```
$ LANG=C ls -l ~/.anyenv/envs/phpenv/lib/libphp5.so | cut -f9- -d' '
/home/ユーザー名/.anyenv/envs/phpenv/lib/libphp5.so -> /home/ユーザー名/.anyenv/envs/phpenv/versions/5.6.9/libexec/libphp5.so*
```

あとはお馴染みのphp.iniファイルの設定とhttpd.confに次の1行が現れるので＃をとっておく。

```
#LoadModule php5_module ~ディレクトリ
↓
LoadModule php5_module ~ディレクトリ
```
これでphpが最新バージョンで使えると思います。

また時間があればanyenvを使ったnode.jsのexpressとrailsの簡単な画面表示のやり方も載せようと思います。

anyenv便利だね。

#追記
##anyenv updateのエラー
つい先日anyenv updateを掛けた時に以下のようなエラー文が出ました。
error: Your local changes to the following files would be overwritten by merge: bin/php-build

バージョン管理ツールを使っている宿命ですね。
この対処法について書きます。
対処法は簡単で~/.anyenv/envs/phpenv/plugins/plugins/binの内部にあるphp-buildをphp-build.orgなどにしてもう一度updateをかけるだけです。
僕が非純正のphp-buildを使っているだけかもしれませんが、これで治ります。ふぅー。一安心。

上にも書きましたが、バージョン管理ツールhomebrewやanyenvを使っているとこういったエラーに遭遇することが多いのでみなさんも気をつけてください。

homebrewの場合はエラーが出てもhomebrew doctorを使えば詳細みたいに見れるのですが、anyenvの場合はそういったものがないと思うのでその辺は臨機応変に焦らず対処しましょう。

##PHP7によるphp-buildのエラーを解決する。
PHP7が追加され、php-buildがエラーをはきました。
その対処法について追記したいと思います。

```
$ cd ~/.anyenv/envs/phpenv/plugins
```
この中にあるphp-buildを削除します。
その後に

```
$ git clone https://github.com/php-build/php-build.git
```
こうする事で以前のphp-buildを最新版のものにリセット出来るのでエラーが無くなると思います。
最後に

```
$ anyenv update
```

完了！！！


##参考にしたサイト
http://memo.xight.org/2014-06-22-1
http://y-uti.hatenablog.jp/entry/2014/10/13/232540
http://furudate.hatenablog.com/entry/2015/01/16/064610