composer入門

# composerとは？

PHPのパッケージ管理システムです
pearに変わるものとして最近広く使われています
rubyでいう、bundlerみたいなものです

参考： http://codezine.jp/article/detail/7827


## composerをインストールする

```bash
$ curl -sS https://getcomposer.org/installer | php
```

これでcomposer.pharができあがります

```bash
$ chmod o+x composer.phar
$ sudo mv composer.phar /usr/local/bin/composer
```

とやっておくと便利ですが、やらなくても別に問題ありません
私はやりません

## composerを使ってパッケージをインストールする

composerでインストールできるパッケージは[Packagist](https://packagist.org)で見ることができます

試しにmigrationツールのphinxを、composerを使ってインストールしてみましょう

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


### インストール方法その１

簡単なのは、コマンドラインで必要なパッケージを指定してインストールする方法です
Packagistのページに、インストールコマンドが書いてあるので、これを参考にインストールします

![スクリーンショット 2015-06-05 18.00.01.png](https://qiita-image-store.s3.amazonaws.com/0/75486/549aafcf-c166-42fe-016a-836419ce03dd.png)

/usr/local/bin/composerにmvしていないので、
`composer`コマンドの代わりに、`php comopser.phar`と読み替える必要があります

```bash
$ 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が依存しているパッケージも含めてインストールされました

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

```json:composer.json
{
    "require": {
        "robmorgan/phinx": "0.4.3"
    }
}
```

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

### インストール方法その２

composer.jsonを自分で書く方法もあります
どちらかというと、こちらの使い方がメインのようです

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

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

composer.jsonをこう修正します

```json:composer.json
{
    "require": {
        "robmorgan/phinx": "0.4.3",
        "guzzle/guzzle": "3.9.3"
    }
}
```

composer updateコマンドを実行します

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

```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"
    }
}
```

```bash
$ php composer.phar update
```

これで入るはずです

## 使わなくなったパッケージを消す

guzzle/guzzleの代わりにpear/http_request2を使うことにします

composer.jsonをこう修正します

```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"
    }
}
```

```bash
$ 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で見つからなくてエラーになっちゃう場合の対処法](http://qiita.com/milano/items/1461d715a90b185da866)

## composerでインストールされたパッケージを使う

プログラム内で

```php
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は好き好き

プログラムを動作させる前に、

```bash
$ php composer.phar install
```

とすることで、必要なパッケージが全てインストールされます
この場合、updateではなく installです


## composer.jsonとcomoser.lockの違い

どのパッケージをインストールしたいか、という指定は全てcomposer.jsonに書きます
で、どのパッケージをインストールしたか、という情報はcomposer.lockに書き込まれます

composer.jsonでは、バージョンの指定を

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