Composer
- Composerとは
- とにかく始める
- Composerを利用してオートロードを行う
- Gitリポジトリを Composer を利用して取得する
- プライベートなComposerリポジトリを作成する
- リリースバージョンについて
- repositoriesについて
- コマンド概要
- その他
Composerとは
公式的にはパッケージ管理システムではなく、依存性管理システムだそうな 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.html
とpackages.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