这个工具是什么
Composer 版本约束检查工具回答两个具体问题:composer.json 里的 ^8.1 || ^7.4 到底能装哪些版本;以及我手上这个 8.3.7 到底满不满足这条约束。
它把约束展开成实际的比较条件(比如 ^1.2.3 展开为「大于等于 1.2.3 且小于 2.0.0」),再逐个检查你给出的版本,避免靠记忆猜。
什么时候用它
- 升级依赖前确认目标版本是否落在约束范围内,判断要不要同时改
composer.json。 - 解释
composer update为什么装到了意料之外的版本。 - 复习几种写法的差别:
^1.2与~1.2的上界完全不同,^0.3.2更特殊。 - 给项目定版本策略:想锁小版本用
~,想跟随主版本用^。 - 排查「为什么这个包一直装不上」,确认是自己的约束写窄了。
有什么限制
- 只判断「单个版本能否被这条约束接受」,不查询 Packagist,也不做完整的依赖求解。真实的
composer install还要看其他包的相互约束与 stability 设置。 - 平台包(
php、ext-*)的版本规则一样适用,但扩展是否真的装了要看你本机的 PHP 环境。 - 分支版本(
dev-master、1.x-dev)只做字面比较,不参与区间大小比较。 - 稳定性规则按「约束里没写后缀就只收稳定版」处理;如果项目里把
minimum-stability调成了dev,实际能装的会更多。 - 不处理
composer.json里的platform、replace、provide等字段的影响。
常见问题
Q:^1.2 和 ~1.2 有什么区别?
A:^1.2 允许到 2.0.0 之前,~1.2 只允许到 2.0.0 之前……实际上 ~1.2 等价于「大于等于 1.2 且小于 2.0」,而 ~1.2.3 才是「小于 1.3.0」。工具会把两者的实际范围并排列出来对比,比记规则更直观。
Q:为什么 ^0.3.2 不能装 0.4.0?
A:0 开头的版本里,次版本号的变化被视为不兼容。Composer 的 caret 对这种情况只允许在 0.3.x 内浮动,上界是 0.4.0。
Q:为什么 1.0.0-beta1 显示「不满足」 >=1.0.0?
A:Composer 默认只接受稳定版。约束里没有写稳定性后缀时,预发布版本会被排除,要放行需要写成 >=1.0.0-beta1 或调整 minimum-stability。
Q:1.0 - 2.0 的上界包含 2.0 吗?
A:包含 2.0.x。上界只写两段时按通配处理,等价于「小于 2.1.0」;写成 1.0.0 - 2.1.0 才是严格的闭区间。