Composer.jsonの色々なバージョンの書き方
こんにちは。
最近体組成計を買ったのですが、乗るたびに体重が増えていて絶望している開発室員です。
今回はComposerのバージョン管理の表記についての話をしたいと思います。
みんな大好きComposer
Composer素晴らしいですよね。
(パッケージ管理システムは偉大)
PHPで開発する場合、必要なソフトウェアをパッケージとしてインストールできますし、
インストールしたパッケージはcomposer.jsonに追記されていくので、
チーム内でjsonファイルを共有しておけば、同じパッケージをコマンド一つでインストールできます。
composer.jsonをGitなどで管理するようにして、各人の環境でインストールしてもらうようにすれば、
必要なソフトウェアを全てGitで管理しなくてすむので余計な容量も食いません。
composer.jsonとcomposer.lock
上記でcomposer.jsonを共有すれば同じパッケージを…と書きましたが、
composer.jsonのみを共有した場合、あくまで同じパッケージをインストール出来るというだけで、
インストールするタイミングによってはインストールされるパッケージのバージョンが違う可能性があります。
それを解消するのがcomposer.lockです。
このファイルはパッケージをインストールすると自動的に生成・更新されます。
初めてパッケージをインストールしたときのバージョン等がこのファイルに記録されます。
また、composer.lockファイルが存在する状態でcomposer install
を叩くと、
パッケージのバージョンに関してはcomposer.lockを参照してインストールしてくれる為、
各環境でバージョンも含めて同じ環境を整えたいのであればcomposer.lockも共有すべきです。
composer.jsonのバージョン表記について
composer.jsonにはパッケージ名とバージョンを記述していくと思いますが、
様々な記述方法があるので、下記を例として紹介します。
{
"package": {
"package-a": "1.2.1",
"package-b": ">1.2.1",
"package-c": ">=1.2.1",
"package-d": "<1.2.1",
"package-e": "<=1.2.1",
"package-f": "!=1.2.1",
"package-g": ">=1.2.1 <2.1.0",
"package-h": ">=1.2.1 <2.1.0 || >=3.0.1",
"package-i": "1.2.1-2.0.0",
"package-j": "*",
"package-k": "1.*",
"package-l": "~1.2.1",
"package-m": "^1.2.1"
}
}
バージョン固定値
"package-a": "1.2.1"
パッケージpackage-a
のバージョン1.2.1
をインストールします。
そのままです。
バージョン範囲指定
比較演算子を利用してバージョンの範囲を指定することができます。
有効な演算子は>
,>=
,<
,<=
,!=
です。
範囲指定をした場合、条件に合致する最新のバージョンをインストールします。
よりも新しい
"package-b": ">1.2.1"
パッケージpackage-b
のバージョン1.2.1
よりも新しいバージョンをインストールします。
これを使うならどちらかというと後述の「以上」を使うことが多いのであまり使わない気がします。
以上
"package-c": ">=1.2.1"
パッケージpackage-c
のバージョン1.2.1
以上のバージョンをインストールします。
>
を使うならこちらですかね。
未満
"package-d": "<1.2.1"
パッケージpackage-d
のバージョン1.2.1
未満のバージョンをインストールします。
単品で使うことはないです。
以下
"package-e": "<=1.2.1"
パッケージpackage-e
のバージョン1.2.1
以下のバージョンをインストールします。
こちらも同じく単品で使うことはないです。
以外
"package-f": "!=1.2.1"
パッケージpackage-f
のバージョン1.2.1
以外のバージョンをインストールします。
正直使わないです。
使うとしたら該当のソフトウェアの特定のバージョンで致命的なバグが発見され、修正パッチも配布されていない時とかでしょうか…。
以上~未満
条件をスペースで区切るとAND
で複数の条件を指定できます。
"package-g": ">=1.2.1 <2.1.0"
パッケージpackage-g
のバージョン1.2.1
以上2.1.0
未満のバージョンをインストールします。
以上~未満、または
さらに||
で区切ることでOR
を使うこともできます。
"package-h": ">=1.2.1 <2.1.0 || >=3.0.1"
パッケージpackage-h
のバージョン1.2.1
以上2.1.0
未満、または3.0.1
以上のバージョンをインストールします。
package-h
に3.0.1
以上のバージョンが存在するなら3.0.1
以上の最新のバージョンをインストールし、
存在しない場合は1.2.1
以上2.1.0
未満の中で最新のバージョンをインストールします。
ハイフンでバージョン範囲指定
"package-i": "1.2.1-2.0.0"
パッケージpackage-i
のバージョン1.2.1
以上2.0.0
以下のバージョンをインストールします。
未満ではなく以下なので注意してください
ワイルドカードでバージョン範囲指定
最新
"package-j": "*"
パッケージpackage-j
の最新バージョンをインストールします。
1.xの中で最新
"package-k": "1.*"
パッケージpackage-k
のバージョン1.x
の最新バージョンをインストールします。
バージョン2.x
から大幅な変更が有り動かなくなりそう。等の時に使います。
チルダ(~)でバージョン範囲指定
"package-l": "~1.2.1"
パッケージpackage-l
のバージョン1.2.1
以上1.3.0
未満の最新バージョンをインストールします。 >=1.2.1 <1.3.0
と同じです。
"package-l": "~1.2"
とした場合はバージョン1.2
以上2.0
未満のバージョンをインストールします。
こちらもワイルドカード1.*
と同じようにマイナーバージョンのみのアップデートを許容したい場合に使います。
キャレット(^)でバージョン範囲指定
"package-m": "^1.2.1"
セマンティックバージョニングに従いメジャーバージョンをアップデートしません。 セマンティックバージョニング
>=1.2.1 <2.0.0
と同じ指定となります。
"package-m": "^0.2.1"
ただし、上記のようにバージョンが1.0未満の場合はマイナーバージョンをアップデートをしないようになります。
(>=0.3.0 <0.4.0
と同じ動作)
さいごに
公式のドキュメントに書いてあることそのままですが、
今回はComposer.jsonのバージョンの記述についての話でした。
場合によって記述を使い分けて効率よくComposerを使っていきたいですね!