Composer
Pearの不満も解決できる!?ライブラリ管理のお供にComposer!
倉知真太郎
自己紹介
- 倉知 真太郎
- システム管理部ベースライブラリグループ
- twitter : @dekokun
- PHP Lover
- Haskell Lover
お仕事
- Android,iOSへのPUSH配信システム作成中
- メール配信システム、PictureFitter運用中
なぜ発表をしようと思ったか
Composerが便利だと聞いていた
個人プロジェクトで使ってみたら便利だった
今後外部ライブラリ管理の主流になりそう
この発表の目的
- 参加者がComposerの存在を知ること
- 参加者がComposerの便利な面を知ること
すでによくご存知の方へ
- 知っていることばかりかと思います
- ごめんなさい
- でも、嬉しい
- ツッコミお願い致します
車輪の再発明は防ぎたい
- Services_Twitter
- PHPUnit
- Net_IPv4
Composer登場以前のPHPの外部ライブラリ管理
サーバ増設時
- 他のサーバのライブラリと異なるバージョンのライブラリをインストールしてしまい動かなくなった…
複数メンバーでの開発時
- 開発メンバが各々PCに勝手に必要ライブラリを入れるため開発メンバ間でライブラリのバージョンが揃わない…
ライブラリバージョンアップ時
- あるシステムのためにライブラリのバージョンを上げたら同じサーバで動いていた別のシステムが動かなくなった…
使用するライブラリ追加時
- サーバに外部ライブラリをインストールをせずにデプロイ…
その他
- 新しい機能を追加した際に必要ライブラリのrequire漏れのページが…
こういうのが欲しい
- ソースコードと一緒に外部ライブラリをGit,SVNなどで管理/共有可能にする仕組み
- サーバではなくプロジェクトに対して外部ライブラリをインストールする仕組み
- requireするのを忘れないような仕組み
- ライブラリ間の依存関係の解決ができる仕組み
Rubyistによる嘲笑
- それ、Bundlerでできるよ!
- PHPerはまだそんな場所にいるのか…(クスクス
他の言語達による追従
- npmでできるよ!(Node.js)
- Cartonでできるよ!(Perl)
- Cabal(-dev)でできるよ!(Haskell)
PHPによる反撃
- PHPにはComposerがある!!
- それ、Composerでできるよ!
Composerとは
- jsonファイルで外部ライブラリを管理
- プロジェクトメンバーでバージョンの共有可能
- 外部ライブラリをプロジェクトのディレクトリにインストール
- インストールしたライブラリを使用するにはautoloadファイルを1つだけrequireすればよい
jsonファイルで外部ライブラリを管理
{
"require": {
"phpunit/phpunit": "3.7.*",
"slim/slim": "1.6.*"
}
}
composer.lockファイルでバージョンを凍結
{
"name": "phpunit/phpunit",
"version": "3.7.13",
"source": {
"type": "git",
"url": "git://github.com/sebastianbergmann/phpunit.git",
"reference": "3.7.13"
}, ...
- composer.lockファイルがある場合、Composerは指定されたバージョンをインストールする
- このファイルを共有することでプロジェクト間のバージョンの同期が可能
インストールしたライブラリの使い方
require_once APP_HOME . '/vendor/autoload.php';
- インストールしたすべてのライブラリがこの1行で使用可能となります
デプロイとの絡め方
- デプロイのたびにcomposer install
- これによりinstall漏れなどがなくなる
- テスト環境で動けば本番環境でも動くことが保証される
Composerを採用しているプロジェクト
- FuelPHP
- Symfony
- Zend Framework
制約
- PHP5.3.2以上
- 実行サーバにgitが必要
- detect_unicode("きっと将来削除されるでしょう"な機能)をoffにする必要あり
欠点
- 誰でもライブラリに登録できる
- デプロイ時の障害点が増える
- デプロイに時間がかかる
上記より、vender下ディレクトリは最終的にはコミットしてしまったほうがいいかもしれない