phpenv 環境で composer global でパッケージをバージョン別にインストールするプラグイン

Composer とても便利ですよね。

composer global require を使えばユーザーグローバルにもインストールできるので、phpunit などのインストールに pear の代わりに使えます。

がしかし、phpenv で複数の php を切り替えられるようにしていても composer global だと $HOME/.composer/vendor にインストールされます。

$ composer global require phpunit/phpunit:\*
$ export PATH=$HOME/.composer/vendor/bin:$PATH
$ which phpunit
~/.composer/vendor/bin/phpunit

いまのところ Packagist に登録されている phpunit はどのバージョンも Require php >=5.3.3 なので特に困りませんが、 折角なら phpenv で管理しているバージョンごとにインストールされたかったのでプラグインを作りました。

インストール

$ cd ~/.phpenv/plugins
$ git clone https://github.com/ngyuki/phpenv-composer.git
 :
$ phpenv rehash
$ hash -r

phpenv rehash で phpenv の shims に composer が現れます。

$ which composer
/home/your/.phpenv/shims/composer

その実体はプラグインの libexec/composer です。

$ phpenv which composer
/home/your/.phpenv/plugins/phpenv-composer/libexec/composer

最初に composer コマンドを実行したときに、phpenv の versions に composer.phar をダウンロードします。

$ phpenv global 5.5.10
$ composer --version
Download composer.phar ...
#!/usr/bin/env php
All settings correct for using Composer
Downloading...

Composer successfully installed to: /tmp/composer.phar
Use it: php /tmp/composer.phar
Move composer.phar to /home/your/.phpenv/versions/5.5.10/composer
Composer version 604a65cc31f3e5d8a2b96802135ac24434e87678 2014-03-06 09:26:16

$ ll ~/.phpenv/versions/5.5.10/composer/
合計 984
-rwxr-xr-x 1 your wheel 1004313  3月  7 03:45 2014 composer.phar

composer コマンドの実行時に COMPOSER_HOMECOMPOSER_CACHE_DIR が指定されます。

COMPOSER_HOME は phpenv の versions の中、COMPOSER_CACHE_DIR は $HOME/.composer のままです。

$ composer config -g home
/home/your/.phpenv/versions/5.5.10/composer

$ composer config -g cache-dir
/home/your/.composer/cache

使用例

composer global require で phpunit などをインストールすると、phpenv の versions の中にインストールされます。

$ composer global require phpunit/phpunit:\*
Changed current directory to /home/your/.phpenv/versions/5.5.10/composer
 :
$ phpenv rehash
$ hash -r
$ phpenv which phpunit
/home/your/.phpenv/versions/5.5.10/composer/vendor/bin/phpunit

$ phpunit --version
PHPUnit 4.0.4 by Sebastian Bergmann.

別のバージョンに切り替えて実行すると、そのバージョンのディレクトリに composer.phar がダウンロードされます。

$ phpenv global 5.3.3
$ composer --version
Download composer.phar ...
#!/usr/bin/env php
Some settings on your machine may cause stability issues with Composer.
If you encounter issues, try to change the following:

Your PHP (5.3.3) is quite old, upgrading to PHP 5.3.4 or higher is recommended.
Composer works with 5.3.2+ for most people, but there might be edge case issues.

Downloading...

Composer successfully installed to: /tmp/composer.phar
Use it: php /tmp/composer.phar
Move composer.phar to /home/your/.phpenv/versions/5.3.3/composer
Composer version 604a65cc31f3e5d8a2b96802135ac24434e87678 2014-03-06 09:26:16

phpunit なども、そのバージョンのディレクトリにインストールされます。

$ composer global require phpunit/phpunit:\*
Changed current directory to /home/your/.phpenv/versions/5.3.3/composer
 :
$ phpenv which phpunit
/home/your/.phpenv/versions/5.3.3/composer/vendor/bin/phpunit