composer入門

More than 3 years have passed since last update.


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を使ってインストールしてみましょう

https://packagist.org/packages/robmorgan/phinx


インストール方法その1

簡単なのは、コマンドラインで必要なパッケージを指定してインストールする方法です

Packagistのページに、インストールコマンドが書いてあるので、これを参考にインストールします

スクリーンショット 2015-06-05 18.00.01.png

/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の内容を見てみましょう


composer.json

{

"require": {
"robmorgan/phinx": "0.4.3"
}
}

コマンドラインで指定したパッケージが記録されていますね


インストール方法その2

composer.jsonを自分で書く方法もあります

どちらかというと、こちらの使い方がメインのようです

phinxに加え、guzzle/guzzleパッケージも入れてみます

https://packagist.org/packages/guzzle/guzzle

composer.jsonをこう修正します


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をこう修正します


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をこう修正します


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コマンドでライブラリをインストールするのが正解なのです