composerとは?
PHPのパッケージ管理システムです
pearに変わるものとして最近広く使われています
rubyでいう、bundlerみたいなものです
参考: http://codezine.jp/article/detail/7827
composerをインストールする
$ curl -sS https://getcomposer.org/installer | php
これでcomposer.pharができあがります
$ chmod o+x composer.phar
$ sudo mv composer.phar /usr/local/bin/composer
とやっておくと便利ですが、やらなくても別に問題ありません
私はやりません
composerを使ってパッケージをインストールする
composerでインストールできるパッケージはPackagistで見ることができます
試しにmigrationツールのphinxを、composerを使ってインストールしてみましょう
インストール方法その1
簡単なのは、コマンドラインで必要なパッケージを指定してインストールする方法です
Packagistのページに、インストールコマンドが書いてあるので、これを参考にインストールします
/usr/local/bin/composerにmvしていないので、
composer
コマンドの代わりに、php comopser.phar
と読み替える必要があります
$ php composer.phar require 'robmorgan/phinx:0.4.3'
./composer.json has been created
Loading composer repositories with package information
Updating dependencies (including require-dev)
- Installing symfony/yaml (v2.6.9)
Downloading: 100%
- Installing symfony/filesystem (v2.7.0)
Downloading: 100%
- Installing symfony/config (v2.6.9)
Downloading: 100%
- Installing symfony/console (v2.6.9)
Downloading: 100%
- Installing robmorgan/phinx (v0.4.3)
Downloading: 100%
symfony/console suggests installing symfony/event-dispatcher ()
symfony/console suggests installing symfony/process ()
symfony/console suggests installing psr/log (For using the console logger)
Writing lock file
Generating autoload files
このように、phinxが依存しているパッケージも含めてインストールされました
$ ll
total 2192
drwxr-xr-x 6 foobar staff 204 6 5 08:44 .
drwx------+ 15 foobar staff 510 6 5 08:27 ..
-rw-r--r-- 1 foobar staff 62 6 5 08:44 composer.json
-rw-r--r-- 1 foobar staff 9896 6 5 08:44 composer.lock
-rwxr-xr-x 1 foobar staff 1105630 6 5 08:27 composer.phar
drwxr-xr-x 7 foobar staff 238 6 5 08:44 vendor
</pre>
composer.json、composer.lock、vendorディレクトリが作られます
composer.jsonの内容を見てみましょう
{
"require": {
"robmorgan/phinx": "0.4.3"
}
}
コマンドラインで指定したパッケージが記録されていますね
インストール方法その2
composer.jsonを自分で書く方法もあります
どちらかというと、こちらの使い方がメインのようです
phinxに加え、guzzle/guzzleパッケージも入れてみます
composer.jsonをこう修正します
{
"require": {
"robmorgan/phinx": "0.4.3",
"guzzle/guzzle": "3.9.3"
}
}
composer updateコマンドを実行します
$ php composer.phar update
Loading composer repositories with package information
Updating dependencies (including require-dev)
- Installing symfony/event-dispatcher (v2.7.0)
Loading from cache
- Installing guzzle/guzzle (v3.9.3)
Downloading: 100%
symfony/event-dispatcher suggests installing symfony/dependency-injection ()
symfony/event-dispatcher suggests installing symfony/http-kernel ()
guzzle/guzzle suggests installing guzzlehttp/guzzle (Guzzle 5 has moved to a new package name. The package you have installed, Guzzle 3, is deprecated.)
Writing lock file
Generating autoload files
guzzle/guzzleがインストールされました
Packagistに無いパッケージを使う
Packagistになくても諦める必要はありません
gitにあるパッケージだって入れることができます
ためしに、
https://github.com/pear/Text_Wiki
を入れてみましょう
composer.jsonをこう修正します
{
"repositories":[
{
"type": "git",
"url": "https://github.com/pear/Text_Wiki"
}
],
"require": {
"robmorgan/phinx": "0.4.3",
"guzzle/guzzle": "3.9.3",
"pear/Text_Wiki": "dev-master"
}
}
$ php composer.phar update
これで入るはずです
使わなくなったパッケージを消す
guzzle/guzzleの代わりにpear/http_request2を使うことにします
composer.jsonをこう修正します
{
"repositories":[
{
"type": "git",
"url": "https://github.com/pear/Text_Wiki"
}
],
"require": {
"robmorgan/phinx": "0.4.3",
"pear/http_request2": "2.2.1",
"pear/Text_Wiki": "dev-master"
}
}
$ php composer.phar update
Loading composer repositories with package information
Updating dependencies (including require-dev)
- Removing guzzle/guzzle (v3.9.3)
- Removing symfony/event-dispatcher (v2.7.0)
- Installing pear/net_url2 (v2.2.0)
Downloading: 100%
- Installing pear/http_request2 (v2.2.1)
Downloading: 100%
Writing lock file
Generating autoload files
これで、guzzle/guzzleが消され、HTTP_Request2が入るでしょう
参考:composerで入れたパッケージがautoloadで見つからなくてエラーになっちゃう場合の対処法
composerでインストールされたパッケージを使う
プログラム内で
require 'vendor/autoload.php';
と書くだけで、guzzleもyamlもText_Wikiも使えるようになります
/usr/share/pear
をinclude_pathに追加して、require_once 'Text_Wiki' と書いたりする必要はありません
composerとgit
composerを使う上で大事なのは、
composer.jsonとcomposer.lockファイルはgit管理する
vendorディレクトリはgit管理しない
ということです
composer.pharは好き好き
プログラムを動作させる前に、
$ php composer.phar install
とすることで、必要なパッケージが全てインストールされます
この場合、updateではなく installです
composer.jsonとcomoser.lockの違い
どのパッケージをインストールしたいか、という指定は全てcomposer.jsonに書きます
で、どのパッケージをインストールしたか、という情報はcomposer.lockに書き込まれます
composer.jsonでは、バージョンの指定を
"guzzle/guzzle": ">=3.9.3",
と書くことで、3.9.3以上の最新バージョンをインストールすることができます。
開発サーバーでインストールした時は、3.9.3が最新だったけど、本番サーバーでインストールする時は3.9.4が出てたら、このままだと開発と本番のバージョンが変わってしまいます
それを防ぐのがcomposer.lockファイルです
composer installコマンドは、composer.lockファイルの情報をもとにパッケージをインストールします
なので、composer.jsonとcomposer.lockを両方git管理し、本番サーバーではcomposer installコマンドでライブラリをインストールするのが正解なのです