View on GitHub

akkunchoi.github.com

Composer

Composerとは

npm, bundlerのPHP版。

公式的にはパッケージ管理システムではなく、依存性管理システムだそうな intro 。 というのも、グローバルな場所にライブラリをインストールするのではなく、プロジェクト内に依存性解決した上でインストールするからだという。 まあどちらでも良いと思います。

個人的に、PEARを使ってプロジェクト内にインストールしていた ので Symfonyなど有名プロジェクトが採用するほど定着した依存管理システムが出てきたのは嬉しい限りです。

自分の見解ですが、用語を整理しておきます。

  • パッケージ:プロジェクト単位のソースコード群
  • リポジトリ:パッケージの集合体。パッケージの配布場所。
  • Composerリポジトリ: リポジトリのうち、type=composer で指定可能なリポジトリ

とにかく始める

$ curl -s https://getcomposer.org/installer | php

# composer.jsonを作成

  "require": {
    "slim/slim": "2.*"
  }

$ php composer.phar install

アプリケーション側でautoloadを読み込むと、クラスが使用できる。

require 'vendor/autoload.php';

$slim = new \Slim\Slim;

Composerを利用してオートロードを行う

1. composer.json を用意

例えばこのような構成 (src ディレクトリに Acme パッケージを配置) の場合

/
|-- src
     |
     `-- Acme
          |
          `-- Hoge.php

composer.json はこうなります。

# composer.json
{
  "autoload": {
    "psr-0": {"Acme": "src"}
  }
}

ベンダープレフィックス(例いうとAcme)を指定する必要があります。ベンダープレフィックスがないパッケージはどうするんでしょうかね。

2. autoloadファイルを生成

install, update でもいいですが、autoload.phpを生成するだけなら、dump-autoloadの方が早いです。

$ php composer.phar dump-autoload

3. autoloadを読み込む

アプリケーション側で require すると自動でクラスが読み込まれるようになります(spl_autoload_registerに登録される)。

<?php
require 'vendor/autoload.php';

$obj = new \Acme\Hoge();

Gitリポジトリを Composer を利用して取得する

Composerに対応するためには依存する側のパッケージがcomposer.jsonを含んでいる必要があります。

// ライブラリ側のcomposer.json
{
  "name": "akkunchoi/library",
  "description": "composer library"
}

パッケージを利用する側では、Gitリポジトリのパスを指定します。repositories という項目で指定されたパッケージが “require” で使えるようになります。Packagist に登録されているパッケージは何も宣言しなくても”require” で指定できます。

// ライブラリを利用する側のcomposer.json
{
  "name": "akkunchoi/sample",
  "description": "composer sample",
  "repositories": [
    { "type": "vcs", "url": "user@localhost:~/sample.git" }
  ],
  "require": {
    "akkunchoi/library": "1.2.x"
  },
}

プライベートなComposerリポジトリを作成する

  • 公開側:
    • 公開サーバー上でライブラリ一覧を作成 => config.json
    • satisにより、パッケージ一覧を生成。パッケージ一覧をWebサーバーで公開。 => プライベートCompserリポジトリ
  • 利用側:
    • repositoriesでプライベートComposerリポジトリを指定

公開側

localhostで公開してみます。自分しか見れないので公開というのも変だな。

$ cd /Users/foobar/Sites # => http://localhost/ で見れるローカルファイルパス
$ mkdir composer
$ cd composer
$ curl -s https://getcomposer.org/installer | php

パッケージ一覧を生成するツール satis をインストール。-sdev--stability=devの意味です。

$ php composer.phar create-project composer/satis -sdev

config.jsonを作成します。

{
    "name": "My Repository",
    "homepage": "http://localhost/composer/web/",
    "repositories": [
        { "type": "vcs", "url": "/Users/foobar/Sites/composer/hoge" }
    ],
    "require-all": true
}

name, homepage にはこの Composerリポジトリ についての情報を記述します。repositoriesにはリポジトリを指定します。 require_allは全パッケージ全バージョンを自動で取得してくれます。指定したい場合は下記のように記述します。

"require": {
    "company/package3": "2.0.0"
}

repositoriesにこのComposerリポジトリで公開したいリポジトリを列挙します。 とりあえず今回は “Users/foobar/Sites/composer/hoge” にgitのプロジェクトを作成して、それを公開します。

$ mkdir hoge
$ cd hoge
$ git init
$ cp ../composer.phar .
$ php composer.phar init

init コマンドで composer.json が作成されます。内容を聞かれますがデフォルトのままで良いです。 composer.jsonを含めてコミットします。

config.jsonを更新したらsatisコマンドでパッケージ一覧を生成します。

# web/ は出力先
$ php satis/bin/satis build config.json web/ 

また、以下の場合にもbuildが必要です。(自動化した方がいいと思います)

  • パッケージの composer.json を変更する
  • リリースバージョンを更新する

web内にindex.htmlpackages.jsonが生成されます。

利用側

利用側では packages.json があるパスを指定します。

{
    "repositories": [
        { "type": "composer", "url": "http://localhost/composer/web/" },
    ],
    "require": {
        "foobar/hoge": "*",
    }
}

installすると、foobar/hoge がインストールされます。

認証をかける場合..

http://getcomposer.org/doc/articles/handling-private-packages-with-satis.md http://ngyuki.hatenablog.com/entry/2012/11/06/210638

リリースバージョンについて

ブランチは全て dev 扱いになる。バージョンっぽいブランチは*-devで、その他はdev-*になる。

例:

  • 1.0 => 1.0.x-dev
  • v2.0.3 => 2.0.3-dev
  • master => dev-master
  • dev => dev-dev

タグを使うといわゆる stable な指定が可能。

注意点としてはcomposer.jsonでバージョンを記述することができるが、これはタグのバージョンと一致させないといけない。 わざわざcomposer.jsonでバージョン記述しなくてもいいかもしれない。

利用する側でのバージョンの指定は 2.* とか * とか

repositoriesについて

リポジトリのtype: git, pear, package, composer, vcsなど。それぞれオプションが異なる。

vcsの場合、urlにはファイルパスやsshプロトコルやgithubのパスなど。composer.json を含んでいる必要がある。

composer.jsonが存在しないような既存のライブラリなどは type=package にすると良い。例えばこんな感じ。

{
    "type":"package",
    "package": {
        "name": "akkunchoi/php-aspectable",
        "version": "dev-master",
        "dist": {
            "url": "https://github.com/akkunchoi/php-aspectable/zipball/master",
            "type": "zip"
        },
        "source": {
            "url": "https://github.com/akkunchoi/php-aspectable.git",
            "type": "git",
            "reference": "master"
        }
    }
}

コマンド概要

http://getcomposer.org/doc/03-cli.md

init composer.jsonを作成してくれる
install インストールする。lockは更新しない
update composer.lockを更新
require composer.jsonにライブラリを追加する
search パッケージの検索
show パッケージの表示
depends 依存パッケージの表示
validate composer.jsonの検証
status 状態を確認
create-project 外部ライブラリをするような感じ?
dump-autoload オートロードファイルの再生成

その他

composer.json 書くのが面倒

init で対話的に作成できる。

$ php composer.phar init

シンタックスエラーは validate でチェックできる。

$ php composer.phar validate

composer.jsonの文法チェックとrecommendな書き方を教えてくれる。

json内にはコメントが書けない(?)のがちょっとつらい。

Alias

例えば symfony/ClassLoader はこのように設定している。 https://github.com/symfony/ClassLoader/blob/master/composer.json

"extra": {
    "branch-alias": {
        "dev-master": "2.2-dev"
    }
}

利用者が “symfony/ClassLoader”: “2.2-dev” と指定することで、自動的に master ブランチのコードを取得させることができる。

インストールでSSLエラーが出る場合

curl: (51) SSL: certificate subject name ‘dl.packagist.org’ does not match target host name ‘getcomposer.org’

一応 https じゃなくても取得できる

$ curl -s http://getcomposer.org/installer | php

または –insecure オプションを付ける

$ curl -s http://getcomposer.org/installer | php

wgetでもOK

$ wget http://getcomposer.org/composer.phar

composer.pharをルートに配置せずに、ディレクトリに置く

$ curl http://getcomposer.org/installer | php -- --install-dir=bin