Composer の Tilde Version Range (~) と Caret Version Range (^) の違いを確認する
PHP のパッケージ管理ツールである Composer ですが、パッケージのバージョンを指定してインストールする方法がいくつかあります。ドキュメントにも説明がありますが、特にわかりにくいのがチルダ(~)を利用したものと、キャレット(ハット)(^)を利用したものです。
挙動を理解するのに結構手間取ったので、まとめてみました。以下では、illuminate/database を例に挙動を確認しています。illuminate/database のバージョン6系の最新版は v6.20.44 です。
composer require の場合
composer require illuminate/database “~6.0.0"
この場合、インストールされるのは、v6.0.4 です。
composer require illuminate/database “~6.0"
この場合、インストールされるのは、v6.20.44 です。
composer require illuminate/database “^6.0.0"
この場合、インストールされるのは、v6.0.0 です。
composer require illuminate/database “^6.0"
この場合、インストールされるのは、v6.0.0 です。
まとめ
composer require で使う場合、チルダでは指定したバージョンの末尾の最新版がインストールされます。これに対して、キャレットの場合は指定したバージョン自身がインストールされます。つまり、composer require illuminate/database "^6.19.1"
を実行すると、v6.19.1 がインストールされます。
composer update の場合
次に、composer.json でバージョン指定をしたときの挙動を確認します。
“illuminate/database": “~6.0.0"
この場合、v6.0.4 にアップデートされます。
“illuminate/database": “~6.0"
この場合、v6.20.44 にアップデートされます。
“illuminate/database": “^6.0.0"
この場合、v6.20.44 にアップデートされます。
“illuminate/database": “^6.0"
この場合、v6.20.44 にアップデートされます。
まとめ
composer update で使う場合、チルダでは指定したバージョンの末尾の最新版にアップデートされます。これに対して、キャレットの場合は指定したメジャーバージョンの最新版にアップデートされます。
両者の使い分け
パッチバージョンの範囲でパッケージを管理したい場合
composer require illuminate/database "~6.0.0"
を使うのがよさそうです。
ただ、メジャーどころのパッケージで、パッチバージョンの範囲でメンテナンスが続けられているものは少ないため、割と早いタイミングでバージョンアップが止まってしまいます。パッチバージョンの定義が「後方互換性を保ったバグ修正」なので、当然かもしれませんが。
マイナーバージョンの範囲でパッケージを管理したい場合
composer require illuminate/database "~6.0"
を使うのがよさそうです。指定したメジャーバージョンの最新版がインストールされ、その後も composer update
するたびに最新版に更新されます。
最初にインストールするバージョンを指定し、その後は最新版を利用したい場合
composer require illuminate/database "^6.20.44"
を使うのがよさそうです。v6.20.44 がインストールされ、その後は composer update
するたびに最新版に更新されます。
結局、どれ使う?
個人的には、composer require illuminate/database "~6.0"
を使うかな。。自動的に最新版をインストールし、その後も最新版に更新できるので。
ちなみに、Packagist Semver Checker を使うと、composer.json で指定したときにどの範囲がアップデートの対象となるかをチェックすることができます。
ディスカッション
コメント一覧
まだ、コメントがありません