開発室ブログ

Composer

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-h3.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を使っていきたいですね!

RecentPost