composer require 是唯一可靠安装指定版本的命令,必须用 vendor/package:1.2.3 格式,冒号不可省略,大小写和 v 前缀敏感,^ 和 ~ 有严格 SemVer 边界。

想装哪个版本就是哪个版本,composer require 是唯一可靠入口;composer install 完全不接受任何版本参数,它只认 composer.lock 里的记录。
用 composer require 装精确版本必须写对冒号
合法语法只有一种:composer require vendor/package:1.2.3。冒号是强制分隔符,缺它直接报 Could not parse version constraint。
- 不能写成
vendor/package@1.2.3或vendor/package=1.2.3——前者被当仓库地址,后者在旧版 Composer 中可能失败 - 包名大小写敏感:
monolog/monolog对,Monolog/Monolog错 - 版本号别带
v前缀:monolog/monolog:v2.9.1会被解析成分支dev-v2.9.1,大概率找不到 - 执行后立刻检查
composer.json:对应行应为"monolog/monolog": "1.2.3",不含^、~或引号包裹的版本字符串
^ 和 ~ 不是“大概装个相近版”,而是有严格 SemVer 边界
它们不是模糊匹配,而是按语义化版本规则截断升级范围,写错等于放任自动升级。
-
^1.2.3等价于>=1.2.3 ,允许升到 <code>1.9.9,但跳过2.0.0 -
~1.2.3等价于>=1.2.3 ,只允许补丁升级(如 <code>1.2.10),1.3.0都不行 -
^0.2.3在 0.x 阶段只允许补丁升级(0.2.4可,0.3.0不可) - 如果目标版本根本不存在(比如包只打了
1.2.2和1.3.0),~1.2.3就永远匹配不到——得先跑composer show -a vendor/package确认 tag 存在
装不上?别急着清缓存,先查三件事
报 No matching package found 或 Your requirements could not be resolved,90% 不是网络问题,而是版本本身不可达。
立即学习“PHP免费学习笔记(深入)”;
- 去 Packagist 页面 搜你要的版本号,确认它是否 listed、是否标了
abandoned - 运行
composer show -a vendor/package,看输出里有没有那个 tag;如果有但带-RC或-beta,得加--stability=RC - 检查 PHP 版本兼容性:某个 tag 的
composer.json可能声明了"php": ">=7.4",而你本地是 PHP 8.2,但它的某个子依赖只支持 7.x —— 这类冲突不会提示具体原因,只会报could not be resolved
composer install 不会读你刚写的版本号
改完 composer.json 就跑 composer install,结果还是旧版?这是预期行为。
-
composer install只按composer.lock还原,完全忽略composer.json里的新版本声明 - 要让新版本生效,必须触发 lock 文件更新:要么
composer update vendor/package(推荐),要么删掉composer.lock再install(不推荐,丢确定性) - CI/CD 中应始终提交
composer.lock,靠它锁定版本;require和update只应在开发机上操作 - 验证是否真装对了?别只信
composer show输出的dev-main,进vendor/目录看composer.json里的version字段,或用git log -n1看 commit hash 是否匹配 tag



















