
composer validate 只校验 composer.json 的 JSON 语法和字段结构是否符合 Composer 官方 Schema,不检查依赖能否安装、包是否存在、PHP 版本是否匹配——通过了 ≠ 能 install,失败了也不代表文件完全不能用。
报 JSON parse error 怎么快速定位到第 X 行第 Y 列
错误信息里写的 line 12 at column 5 就是真实出错点,不是模糊提示。编辑器直接跳转后,重点检查:
- 末尾多出的逗号(尤其在
"require"、"autoload"这类对象或数组的最后一项后) - 单引号代替双引号(
'name': 'myorg/mylib'❌,必须是"name": "myorg/mylib") - 从网页复制来的中文标点、零宽空格(U+200B)或 UTF-8 BOM 头(
xxd composer.json | head看开头是否有ef bb bf)
绕过 Composer 直接测纯 JSON 合法性:php -r "$j = file_get_contents('composer.json'); $d = json_decode($j); if (!$d) { echo json_last_error_msg().\"\n\"; }",报错更直白。
为什么默认模式下很多错误被放过去了
composer validate 默认只把硬性错误当失败,其余全当警告——CI 里不加 --strict 就等于没校验:
-
"autoloader": {}→ 拼错字段名,应为"autoload",默认不拦 -
"type": "libary"→ 拼错且值非法,--strict才报错 -
"minimum-stability": "dev-master"→ 已弃用写法,--strict才拦截 -
"license": "MIT License"→ 非 SPDX 标准值,--strict才变错误
CI/CD 中务必固定用:composer validate --strict --no-check-publish。--no-check-publish 跳过 Packagist 发布检查,防网络超时中断流程。
validate 通过了,install 却失败?这是设计使然
composer validate 完全不联网、不查 Packagist、不运行依赖求解器。它只读字符串,不管逻辑:
-
"require": {"monolog/monolog": "999.0.0"}→validate说 OK,install报Could not find package - 私有包
"myorg/mylib"没配repositories→validate沉默,install才炸 -
"php": ">=8.0"写得再标准,在 PHP 7.4 环境下install依然失败
真正暴露依赖问题的命令是:composer install --dry-run。它模拟完整安装流程,校验包存在性、版本可解析性、锁文件一致性,且不写 vendor、不改缓存。
CI/CD 中该组合哪些命令才真正靠谱
单跑 composer validate 是高风险操作。推荐组合:
-
composer validate --strict --no-check-publish:语法 + schema + 必填项全检,跳过网络依赖 -
composer validate --lock:显式校验composer.lock是否由当前composer.json生成(防止手动改lock) -
composer install --dry-run:验证依赖可行性,不落盘、不污染环境
字段顺序、注释、路径是否存在、autoload 映射目录是否真实可读——这些 validate 全都不管。真要覆盖全面,还得靠 --dry-run 和人工确认。











