Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
49
Help us understand the problem. What is going on with this article?
@0828

composer入門

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

インストール方法その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パッケージも入れてみます

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

49
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
0828

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
49
Help us understand the problem. What is going on with this article?