跳到主要内容

Composer 版本约束检查工具

检查某个版本能否满足 composer.json 里的约束,并把 ^ \~ 等写法展开成实际的范围。

常用写法

第 1 段 8.1.0 ≤ 版本 < 9.0.0

>=8.1.0 且 <9.0.0

第 2 段 7.4.0 ≤ 版本 < 8.0.0

>=7.4.0 且 <8.0.0

逐个版本的结果3 / 5 满足
  • 7.4.33满足 命中第 2 段
  • 8.0.30不满足
  • 8.1.25满足 命中第 1 段
  • 8.3.7满足 命中第 1 段
  • 9.0.0不满足

^1.2.3 允许到 2.0.0 之前,但 ^0.3.2 只到 0.4.0 之前——0 开头的版本按次版本锁,这是最容易踩的一条。

1.0 - 2.0 的上界写成两段时按通配处理,等于是「小于 2.1.0」;写成 1.0.0 - 2.1.0 才是闭区间。

约束里没写稳定性后缀时只收稳定版:>=1.0.0 不会匹配 1.0.0-beta1,写成 >=1.0.0-beta1 才会放行同级别的预发布版本。

这里判断的是「某个具体版本能否被这个约束接受」,不查 Packagist,也不做依赖求解——真实的 composer install 还要看其他包的相互约束。

这个工具是什么

Composer 版本约束检查工具回答两个具体问题:composer.json 里的 ^8.1 || ^7.4 到底能装哪些版本;以及我手上这个 8.3.7 到底满不满足这条约束。

它把约束展开成实际的比较条件(比如 ^1.2.3 展开为「大于等于 1.2.3 且小于 2.0.0」),再逐个检查你给出的版本,避免靠记忆猜。

什么时候用它

  1. 升级依赖前确认目标版本是否落在约束范围内,判断要不要同时改 composer.json。
  2. 解释 composer update 为什么装到了意料之外的版本。
  3. 复习几种写法的差别:^1.2 与 ~1.2 的上界完全不同,^0.3.2 更特殊。
  4. 给项目定版本策略:想锁小版本用 ~,想跟随主版本用 ^。
  5. 排查「为什么这个包一直装不上」,确认是自己的约束写窄了。

有什么限制

  • 只判断「单个版本能否被这条约束接受」,不查询 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 才是严格的闭区间。

相关工具

同类或常用搭配,接着往下做