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 で指定したときにどの範囲がアップデートの対象となるかをチェックすることができます。

この記事を書いた人

グッドネイバー

“ Webに悩むお客さまの「よき隣人」でありたい ” をモットーに、Web システム開発(主に Laravel)、Web マーケティング支援の仕事をしています。詳しい業務内容はこちら。お仕事のご依頼・ご相談はこちらからお気軽にどうぞ。