composer validate --strict 实际效果是启用 Composer 官方 Schema 级别校验,检查必填字段缺失、类型错误、弃用字段等,warning 默认不中断执行也不改变退出码,需配合 --fail-on-warning(≥2.5)或脚本解析才能使 CI 失败。

什么是 composer validate --strict 的实际效果?
它不只是检查 composer.json 是否语法合法,而是强制验证所有字段是否符合 Composer 官方 Schema 规范,包括:
- 必填字段(如
name、type)缺失会报错 - 字段值类型错误(例如把
version写成对象而非字符串) - 弃用字段(如已移除的
require-dev中的phpunit/phpunit旧约束写法) - 不推荐但未废弃的写法(如使用
dev-master作为版本约束)也会被标记为 warning
默认 composer validate 只校验 JSON 结构和基础字段,--strict 才真正启用 Schema 级别校验。
运行时常见报错及对应修复方式
$ composer validate --strict
./composer.json is valid, but with warnings
Warning: The version field is present, it is recommended to leave it out if the package is not a distribution archive.
Warning: require-dev.phpunit/phpunit : unbound version constraints (>=9.6) should be avoided
这类 warning 在 --strict 下虽不中断执行,但 CI/CD 中常需升级为 error。解决方法:
-
version字段:私有包建议完全删除,由 VCS 标签自动推导;若必须保留,请确认是稳定语义化版本(如"1.2.3"),不能是"dev-main"或"*" - 松散版本约束:
"phpunit/phpunit": ">=9.6"→ 改为"^9.6"或"~9.6.0" - 缺失
type字段:补上"type": "library"(可选值见 Composer 文档) -
autoload配置缺失或路径不存在:确保psr-4映射的目录真实存在,且命名空间结尾带\(如"App\": "src/",不是"App")
CI 中如何让 --strict 失败时真正中断流程?
composer validate --strict 默认对 warning 不返回非零退出码,这会导致 GitLab CI / GitHub Actions 误判为成功。正确做法是加 --no-check-all 并配合 --fail-on-warning(Composer 2.5+):
- Composer ≥ 2.5:
composer validate --strict --fail-on-warning
- Composer
- 更可靠的做法:在
composer.json中声明"config": { "strict": true },再配合自定义脚本调用composer validate(该 config 仅影响部分校验行为,不能替代命令行参数)
注意:--strict 本身不会导致命令退出码变化,只有 --fail-on-warning 或解析输出才能实现“warning 即失败”。
为什么本地通过但 CI 失败?常见环境差异点
- Composer 版本不同:CI 使用的镜像可能装的是旧版(如 2.2),不支持
--fail-on-warning;本地是 2.6,功能正常
- 工作目录差异:CI 运行时可能在子目录,而
composer.json 不在当前路径;应显式指定:composer validate --strict --no-check-publish --file=./path/to/composer.json
- 文件换行符或 BOM:Windows 编辑保存的
composer.json 带 BOM 会导致 Schema 校验失败,提示 JSON decode error;用 file composer.json 检查编码,改用 UTF-8 without BOM
- Git sparse-checkout 或 .gitattributes 导致文件不完整:CI 拉取时漏了
composer.lock 或相关 autoload 目录,触发路径校验失败
--fail-on-warning;本地是 2.6,功能正常 composer.json 不在当前路径;应显式指定:composer validate --strict --no-check-publish --file=./path/to/composer.json
composer.json 带 BOM 会导致 Schema 校验失败,提示 JSON decode error;用 file composer.json 检查编码,改用 UTF-8 without BOM composer.lock 或相关 autoload 目录,触发路径校验失败 严格模式下最易被忽略的,其实是 warning 的“静默性”——它不中断执行,也不改变退出码,除非你明确告诉 Composer 把 warning 当 error 看。










