忙しい人のためのComposerメモ

※5年以上前に別のナレッジベースへ投稿していたものを書き出しただけなので情報が古い可能性があります。

システム要件
---------------------------------------------------------------
+ PHP5.3.2以上
+ git、SVN、hgがインストールされている(どれが必要かはパッケージによる)
+ マルチプラットフォーム

覚えておくべきこと
---------------------------------------------------------------
+ composer.jsonはインストールしたいものを列挙する
+ `composer install`するとcomposer.lockが作られる
+ `composer install`はcomposer.jsonに従って行われる
    + ただしcomposer.lockがある場合はロックファイルに記述されたバージョンをインストールする
+ composer.lockはインストールされたものが列挙される
+ `composer update`するとパッケージが更新される
    + 複数人で環境を合わせている場合、実行するのは基本的にinstallコマンドのみ
    + updateはcomposer.lockも書き換える。

### composerを使用している既存のプロジェクトに参加する場合
+ composer.lockがない場合はリーダーに指示を仰ぐ。
    + 勝手に`composer update`しないこと。
    + updateコマンドを実行するとcomposer.lockを無視してcomposer.jsonを参照してしまう。
    + composer.jsonの記述によっては違うバージョンになってしまう。
+ パッケージの取得はcomposer.lockがある状態で`composer install`で行う。
    + 識者によってパッケージが更新された場合はcomposer.lockを受け取ってインストールする。

### composer.lockを書き換えずに特定のパッケージだけ更新したい場合
+ `composer update pear/console_commandline`
    + パッケージ名を指定して個別にアップデートする

基本
---------------------------------------------------------------
+ composerはPHPのパッケージを管理してくれるソフトウェア。
+ composer本体はPHPで出来ている。
    + 実行ファイルの`.phar`はjavaでいうjarのようなもの。
+ composer本体はプロジェクト外にインストールする。
+ composerは内部でgitやsvnなどを使ってパッケージをインストールする。(設定による)
+ マルチプラットフォームでWindows用にはexeが用意されている。
+ composerはPackagistという中央リポジトリが用意されている。
    + デフォルトではそこから取得するが、自分でリポジトリ作ることも出来る(satis)
    + zipなどを指定することも出来る

使い方
---------------------------------------------------------------
+ 基本的な実行方法は`composer コマンド名`
    + `composer install`
    + `composer updateなど`
+ プロジェクトのディレクトリに`composer.json`を作成してインストールコマンドを叩く。
    + `composer.json`にはインストールしたいパッケージを書いておく。
+ 実行したディレクトリにvendorディレクトリが作られ、その中にパッケージがインストールされる。
+ 実際にインストールされたパッケージが記述された`composer.lock`が作られる。

composer.jsonとcomposer.lock(ロックファイル)
---------------------------------------------------------------
+ composer.jsonはインストールしたいパッケージを列挙したjsonファイル。
    + composer.jsonは取得するパッケージのバージョンを「v2.0以上」のように曖昧に書ける。(例：1.0.\*)
+ composer.lockはインストールされたパッケージが列挙されたjsonファイル。
    + composer.lockはcomposer.jsonの曖昧表現から実際にインストールされたバージョンが記述される。
+ 初めてinstallするとcomposer.jsonを見てcomposer.lockが作られる。
+ composer.lockがある状態でinstallするとcomposer.lockを見てインストールされる。

パッケージ
---------------------------------------------------------------
+ パッケージ名の`xxxx/yyyy`というフォーマットは前者がベンダ名で後者がパッケージ名
    + 複数のベンダが同じパッケージ名を使えるように考慮されている
+ パッケージバージョンの表記はタグかブランチかで分かれる。
+ タグがあるならタグの安定版を使ったほうがいい。
    + タグの場合は`1.0.0`、`v2.0.0`のような形式となる
    + ブランチの場合は`dev-master`、`2.0.1`のような形式となる。
    + オプションとして`-pach`、`-alpha`、`beta`、`-RC`といったオプションを付加できる。
    + オプションはタグの場合は後部に、ブランチの場合は前部に付加する。
    + ただし、ブランチ名がタグ名の規約に合わせて付けられている場合、{ブランチ名}-devという名前になる。

### タグ名の例
+ 1.0.0
+ v2.0.0-beta2
+ v3.0.1-alpha

### ブランチ名の例
+ dev-master
+ 2.0.1-dev


composer.jsonサンプル
-----------------------------------------------------------------
### 基本
```json
{
	"require": {
		"monolog/monolog": "1.0.*"
	}

	"require-dev": {
		"phpunit/phpunit": "3.7.*",
	}
}
```

開発時にだけ必要なものはrequire-devに書く。
本番環境でインストールするときに`composer install -no-dev`とすれば、
require-devで指定されているものはインストールされない。

### リポジトリ指定

#### GitやSVNのリポジトリなら
```json
{
	"repositories": [
		{
			"type": "vcs",
			"url": "https://github.com/hoge/hogehoge"
		}
	],
	"require": {
		"hoge/hogehoge": "1.0.*"
	}
}
```

#### PEARリポジトリなら
```json
{
	"repositories": [
		{
			"type": "pear",
			"url": "http://pear.php.net"
		},
		{
			"type": "pear",
			"url": "http://pear.phpunit.de"
		}

	],
	"require": {
		"pear-phpunit/PHPUnit": "3.4.*",
		"pear-php/Mail": "1.2.*",
		"pear-pear/Net_SMTP": "1.4.1",
	}
}
```

Vendor名はpear-{channelName}の形式になる

> ※PHPUnitのPEAR channelは2014年末に終了済み

#### packageそのものを直接指定するなら
```json
{
	"repositories": [
		{
			"type": "package",
			"package": {
				"name": "smarty/smarty",
				"version: "3.1.8",
				"dist": {
					"url": "http:www.smarty.net/files/Smarty-3.1.8.zip",
					"type": "zip"
				}
			}
		},
	],
}
```

zipファイルで配布されているパッケージを直接指定するサンプル。

参考リンク
----------------------------------------
> Dependency Manager for PHP
> https://getcomposer.org/
> https://kohkimakimoto.github.io/getcomposer.org_doc_jp/doc/


> Qiita : composer 導入をまじめに考える
> http://qiita.com/notona/items/c5a087d8dd446d315e6e


> Slideshare : いまさらComposer
> http://www.slideshare.net/mkkn00/ss-36062876