加--strict才算真正校验,否则仅检查JSON语法和必填字段存在性;它启用完整Schema校验,拦截name缺vendor/、version格式错误、字段拼写错误等80%低级配置问题。

加 --strict 才算真正校验,不加等于没跑。 默认 composer validate 只做 JSON 解析 + 必填字段存在性检查,拼错 autoload 写成 autoloader、type 写成 tyep、name 缺 vendor 部分,全都不报错——CI 里看着 “OK”,合进去就崩。
为什么默认 validate 总是显示 OK 却出问题
它根本不校验字段值是否合法,只管“有没有”和“是不是 JSON”。比如:
-
"name": "myapp"→ 缺vendor/前缀,严格模式下直接报错;默认模式放行 -
"require": {"php": ">= 8.1"}→ 中间多空格,解析失败,--strict拦住;默认只当字符串存着 -
"autoload": {"psr-4": {"App\": "src/App"}}→ 路径末尾没/,且命名空间漏反斜杠,--strict校验路径结构;默认不查 -
"minimum-stability": "dev-master"→ 已弃用,--strict报错;默认仅警告
CI/CD 里必须加的参数组合
光 composer validate --strict 还不够,它对 warning 不改退出码,CI 可能误判成功。要让它真失败,得:
- Composer ≥ 2.5:加
--fail-on-warning,warning 升 error,返回非零码 - 旧版 Composer:用管道捕获输出,
composer validate --strict 2>&1 | grep -q "Warning:" && exit 1 - 跳过 Packagist 发布检查(防网络超时):
--no-check-publish - 显式校验 lock 文件一致性:
composer validate --lock,防止手动改composer.lock
常见报错对应的真实问题
不是所有报错都该立刻改代码,先看是不是配置硬伤:
-
Property autoloader is not defined→ 字段名拼错,应为autoload -
Required key "description" is missing→--strict下必填,但 CI 可配--no-check-publish跳过 -
Invalid value for 'name': 'myapp' must be lowercase and contain only letters...→ 缺vendor/name格式,补上如"acme/myapp" -
classmap path does not exist or is not readable→"autoload": {"classmap": ["src"]}中src目录为空或不存在,删掉或补文件 -
Value "dev-master" is not an allowed value→ 替换为^1.0或dev-main(新版支持)
最常被忽略的一点:validate 从不联网、不读仓库、不校验 PHP 版本是否匹配。它只管“写得对不对”,不管“装不装得上”。想确认能不能装,必须跟 composer install --dry-run 配合用。


















