こもろぐ @tenkoma

What We Find Changes Who We Become -- Peter Morville著『アンビエント・ファインダビリティ 』

広告:本ブログで紹介している書籍等商品の紹介でAmazonアソシエイトを利用していることがあります。

ローカル開発環境のPHPをphpenv から php-build + direnv に変えた

engineering.otobank.co.jp

こちらやってみました。

php-build を使う

GitHubリポジトリを管理する ghq はインストール済みとして, まず php-build をインストールする

$ ghq get php-build/php-build
$ ghq look php-build
$ ./install.sh
$ exit

現在最新の PHP 7.1.6 をビルドしてみる

php-build -i development 7.1.6 ~/local/php/7.1.6
$ ~/local/php/7.1.6/bin/php -v
PHP 7.1.6 (cli) (built: Jun 10 2017 16:21:37) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2017 Zend Technologies
    with Zend OPcache v7.1.6, Copyright (c) 1999-2017, by Zend Technologies
    with Xdebug v2.5.4, Copyright (c) 2002-2017, by Derick Rethans

direnv を使って、ディレクトリごとにphpのバージョンを指定する

direnv では cd した時に .envrc の内容を実行します。 そのファイルで $PATH を変更することでディレクトリごとにPHPバージョンの切り替えが実現できます。

path/to/project/.envrc

PATH_add $HOME/local/php/7.1.6/bin

.envrc を保存したとき、

direnv: error .envrc is blocked. Run `direnv allow` to approve its content.

と怒られる場合は

$ direnv allow

を実行するとdirenvが使えるようになります。 ここまでセットアップすれば以下のように切り替わります。

$ php -v
PHP 7.0.19 (cli) (built: May 21 2017 11:56:11) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies
$ cd ~/projects/sample_projects/direnv_sample
direnv: loading .envrc
direnv: export ~PATH
$ php -v
PHP 7.1.6 (cli) (built: Jun 10 2017 16:21:37) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2017 Zend Technologies
    with Zend OPcache v7.1.6, Copyright (c) 1999-2017, by Zend Technologies
    with Xdebug v2.5.4, Copyright (c) 2002-2017, by Derick Rethans

PHPのバージョンアップがあったときは

新しいバージョン定義が追加されていれば、(Pull Requestで更新されてます) git pull して ./install.sh すれば新しいバージョンをビルドできます。以下のような感じです。

$ ghq look php-build
        cd /Users/tenkoma/src/github.com/php-build/php-build
bash-3.2$ git pull
Already up-to-date.
bash-3.2$ ./install.sh
Installing php-build in '/usr/local'
  - creating directories... done.
  - copying files... done.
Done.