composer validate仅校验composer.json的json语法和字段结构合规性,不验证包存在性、版本可解性或 autoload 路径有效性;真正判断“能否装上”需用composer install --dry-run。

composer validate 不是“能不能装上”的判断依据,它只管 composer.json 写得合不合 JSON 规范、符不符合 Composer 的字段结构要求。 通过了不代表能 composer install,失败了也不代表文件完全不能用——可能只是少了个 description 或多敲了个逗号。
报错定位:JSON parse error on line X at column Y 就是精确位置
错误信息里写的行号和列号就是真实出错点,不是提示你“大概在这附近”。打开编辑器直接跳转过去,重点检查三类低级错误:
- 末尾多出的逗号(尤其在
"require"、"autoload"这类对象或数组的最后一项后) - 中文标点或零宽空格(U+200B),常见于从网页复制粘贴;可用
xxd composer.json | head查 BOM 或非法字符 - 单引号代替双引号(
'name': 'myorg/mylib'是非法的,必须写成"name": "myorg/mylib")
如果报错总在第 1 行,但文件明明有几十行,大概率是 UTF-8 BOM 头导致的。用 php -r "$j = file_get_contents('composer.json'); $d = json_decode($j); if (!$d) { echo json_last_error_msg().\"\n\"; }" 可绕过 Composer 直接测纯 JSON 合法性。
--strict 不是“更严的语法检查”,而是把警告当错误
默认情况下,composer validate 对缺失 description、拼错字段名(如把 autoload 写成 autoloader)、用错 type 值(如 "libary")都只警告。加了 --strict 才会中断并报错:
-
"autoloader": {...}→Property autoloader is not defined - 缺
description字段 →Required key "description" is missing -
"minimum-stability": "dev-master"→Value "dev-master" is not an allowed value
CI/CD 流水线里务必加 --strict,配合 set -e 或 fail-fast: true,否则校验失败却继续往下跑,就失去意义了。
真正暴露依赖问题的命令是 --dry-run,不是 validate
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:模拟完整安装流程,校验包存在性、版本可解性、锁文件一致性 -
composer install --no-install --dry-run:更轻量,跳过下载和解压,纯做解析,CI 里推荐 -
composer validate --lock:单独校验composer.lock和composer.json是否匹配(改过 lock 文件后必跑)
别忽略 --no-check-publish 和路径参数
--no-check-publish 跳过对发布相关字段的校验(比如 name 格式是否符合 Packagist 规范、license 是否为 SPDX 标准值),适合本地开发或 CI 中快速过语法关,避免因网络或策略问题中断流程。
默认只校验当前目录下的 composer.json。想校验子目录里的配置,得显式传路径:
composer validate tests/fixtures/composer.jsoncomposer validate --strict --no-check-publish path/to/composer.json
复杂点在于:validate 通过 ≠ autoload 路径存在,≠ 依赖可达,≠ PHP 版本兼容。它只是 lint 工具,不是执行预检。最容易被忽略的是——你改了 autoload 里的路径,validate 不报错,但 composer dump-autoload 会立刻告诉你“找不到那个目录”。











