PyrusでプロジェクトローカルなPEARライブラリインストール : PHP Advent Calendar jp 2011 Day 10

PHP Avent Calendar jp 2011の10日目、[twitter:@calpo22]です。
→前日「includeとextractの組み合わせでテンプレート処理を作る。PHPのAdvent Calender #9 - それマグで!

※追記 2012/09/16
PHPが古いとかの事情がなければ、今はライブラリの依存管理にはcomposer使うのがいいと思います。
取り急ぎ手元でPHPUnit使いたいとかであれば http://qiita.com/items/81085381c4281e498cde で一発。


みなさんPEAR使ってますか?

PEARのライブラリを普通にインストールすると/usr/binとかに入るんですが、そうじゃなくて自分用に~/binに入れたいとか、フレームワークのvendorディレクトリに入れたいとかありますよね。
これで結構苦労していたところ、今年のPHPカンファレンスで「Pyrus使うと捗るよ」みたいな話を聞きくことができました。
pearの後継となるパッケージマネージャらしく、「なにそれすごい!これでかつる!」と期待に胸をふくらませつつ家に帰って試してみたところ・・・

とにかく日本語の情報が全然無い

という状態でなんか凹みました。

でも、Pyrusだとpearよりもプロジェクトローカルなライブラリのインストールがやりやすいです!
ということでPyrusによるPEARライブラリインストールのご紹介。

まずは俺ローカルなPEARライブラリインストール

~/mypyrusに自分用のPEARライブラリをインストールしてみます。
(必ずしも俺ローカルが必要なわけではないですが、整理しやすかったのでこのようにしています)

pyrus.pharダウンロード

pyrus.phar自体はどこにあってもいいんですが、とりあえず~/mypyrusに入れておくことに。

$ mkdir mypyrus
$ cd mypyrus/
$ wget http://pear2.php.net/pyrus.phar
pyrusの初期設定

最初にpyrusを実行すると初期設定が行われ、パッケージのインストール先のディレクトリ等が設定されます。

$ php pyrus.phar install
Pyrus version 2.0.0a3 SHA-1: BE7EA9D171AE3873F1BBAF692EEE9165BB14BD5D
Pyrus: No user configuration file detected
It appears you have not used Pyrus before, welcome!  Initialize install?
Please choose:
  yes
  no
[yes] :
# ↑yesなのでそのままEnter
Great.  We will store your configuration in:
  /home/calpo/.pear/pearconfig.xml
Where would you like to install packages by default?
[/home/calpo/mypyrus] :
# ↑にインストールなのでそのままEnter

$ ls ~/.pear/pearconfig.xml
/home/calpo/.pear/pearconfig.xml

~/.pear/pearconfig.xmlが作成されます。

config-showコマンドで設定を確認できます。

$ php pyrus.phar config-show
Pyrus version 2.0.0a3 SHA-1: BE7EA9D171AE3873F1BBAF692EEE9165BB14BD5D
Using PEAR installation found at /home/calpo/mypyrus
System paths:
  php_dir => /home/calpo/mypyrus/php
  ext_dir => /usr/lib64/php/modules
  cfg_dir => /home/calpo/mypyrus/cfg
  doc_dir => /home/calpo/mypyrus/docs
  bin_dir => /usr/bin
  data_dir => /home/calpo/mypyrus/data
  ・
  ・

bin_dirが/usr/binになっているので自分用に変更しましょう。
(~/mypyrus/.config が生成されます)

$ php pyrus.phar set bin_dir /home/calpo/mypyrus/bin
$ php pyrus.phar config-show
  ・
  ・
  bin_dir => /home/calpo/mypyrus/bin
  ・
  ・
PHPUnitインストール

準備ができたので俺専用PHPUnitをインストールしてみましょう。

$ php pyrus.phar set auto_discover on
$ php pyrus.phar channel-discover pear.phpunit.de
$ php pyrus.phar install phpunit/PHPUnit
Pyrus version 2.0.0a3 SHA-1: BE7EA9D171AE3873F1BBAF692EEE9165BB14BD5D
Using PEAR installation found at /home/calpo/mypyrus
Sorry, phpunit/PHPUnit references an unknown channel pear.symfony-project.com for pear.symfony-project.com/YAML
Do you want to add this channel and continue?
Please choose:
  yes
  no
[yes] :
# ↑途中チャンネルの追加について問われます
  ・
  ・
pear.phpunit.de/PHP_Invoker depended on by pear.phpunit.de/PHPUnit

どん!
入りました。

$cd ~/mypyrus
$ ls
bin  cache  docs  downloads  php  pyrus.phar

$ ls bin/
phpunit

$ ls php/
File  PHP  PHPUnit  SymfonyComponents  Text
include_pathの設定

早速bin/に入ったphpunitを実行しようとしても、必要なディレクトリがinclude_pathに設定されていないので怒られます。

$ cd ~/mypyrus/bin
$ ./phpunit
Warning: require(PHPUnit/Autoload.php): failed to open stream: No such file or directory in /home/calpo/mypyrus/bin/phpunit on line 42

$ php -i | grep include_path
include_path => .:/usr/share/pear:/usr/share/php => .:/usr/share/pear:/usr/share/php

今回はお手軽に~/mypyrus/bin/phpunit に設定を追加して、~/mypyrus/phpをinclude_pathに入れてしまいます。

<?php
// ↓をrequireの前に追加
set_include_path(
	realpath(dirname(__FILE__).'/../php')
	. PATH_SEPARATOR . dirname(__FILE__)
	. PATH_SEPARATOR . get_include_path());

ただライブラリによってbin/に入るファイルがphpスクリプトだったりシェルスクリプトだったり、PHP_CLASSPATHみたいな独自の環境変数を設定する必要があったりとなんかもう・・・
php.iniが変更できるならそれが一番確実です。

$ cd ~/mypyrus/bin
$ ./phpunit --version
PHPUnit 3.6.4 by Sebastian Bergmann.

いぇーい

プロジェクトローカルなPEARライブラリインストール

続いて適当なプロジェクトのvendorディレクトリにプロジェクト専用PEARライブラリをインストールしてみます。

ディレクトリの設定

setとかのコマンドの前にディレクトリを指定してあげると、そこローカルな作業と設定ができます。
(そのディレクトリに.configが出来上がります)

例えば~/project_hoge/vendorにインストールする場合・・・

$ php pyrus.phar /home/calpo/project_hoge/vendor set bin_dir /home/calpo/project_hoge/vendor/bin
$ php pyrus.phar /home/calpo/project_hoge/vendor config-show
Pyrus version 2.0.0a3 SHA-1: BE7EA9D171AE3873F1BBAF692EEE9165BB14BD5D
Using PEAR installation found at /home/calpo/project_hoge/vendor
System paths:
  php_dir => /home/calpo/project_hoge/vendor/php
  ext_dir => /usr/lib64/php/modules
  cfg_dir => /home/calpo/project_hoge/vendor/cfg
  doc_dir => /home/calpo/project_hoge/vendor/docs
  bin_dir => /home/calpo/project_hoge/vendor/bin
  ・
  ・
インストール

チャンネルの設定などもプロジェクトローカルなのでまた設定します。

$ php pyrus.phar /home/calpo/project_hoge/vendor set auto_discover on
$ php pyrus.phar /home/calpo/project_hoge/vendor channel-discover pear.phpunit.de
$ php pyrus.phar /home/calpo/project_hoge/vendor install phpunit/PHPUnit
  ・
  ・
pear.phpunit.de/PHP_Invoker depended on by pear.phpunit.de/PHPUnit

$ ls ~/project_hoge/vendor/bin
phpunit

こんな感じでプロジェクトローカルなPEARライブラリをほいほいインストールしていけます。

さらに・・・

package.xmlをmakeしてプロジェクトごとに必要なパッケージをまとめて管理したりと夢がひろがるらしいので日本語の情報ください :)

みんなでつかおうPyrus!


明日は[twitter:@kokkekun]さんです。