composer validate 离线失败是因为默认尝试访问 packagist.org 校验 schema;需用 --no-plugins --no-scripts --offline 三参数组合强制离线,缺一不可。

composer validate 为什么离线会失败
因为 composer validate 默认会尝试加载 composer.json 中声明的 repositories(尤其是 packagist.org),并校验 schema 兼容性,哪怕只是语法检查。一旦网络不通或 Packagist 不可达,就会卡在远程元数据获取阶段,报错类似:Failed to decode response: file_get_contents(): php_network_getaddresses: getaddrinfo failed 或直接超时。
用 --no-plugins --no-scripts --offline 强制离线模式
这三个参数组合是关键,缺一不可:
-
--offline:禁止所有网络请求,包括 schema 下载和 repository 解析 -
--no-plugins:防止第三方插件(比如composer-unused)偷偷触发网络调用 -
--no-scripts:避免scripts段里定义的命令(如php -r "file_get_contents(...)”)意外联网
完整命令:composer validate --no-plugins --no-scripts --offline
注意:如果 composer.json 里写了自定义 repositories(比如私有 Git 地址),即使加了 --offline,某些旧版 Composer(repositories 块再验证。
验证前先确认本地 schema 缓存是否可用
Composer 会缓存 JSON Schema(如 https://raw.githubusercontent.com/composer/composer/main/res/composer-schema.json),但缓存只在首次联网后生成。如果你从未连过网,或清空过 COMPOSER_HOME 目录,--offline 会直接报 schema 不存在错误:Could not load package composer/composer at version 2.x-dev: Could not parse version constraint ...(实际是 schema 加载失败的伪装错误)。
解决办法只有两个:
- 提前在有网环境运行一次
composer validate(不带--offline),让 schema 落地到本地缓存目录 - 手动下载 schema 文件,放到
~/.composer/cache/repo/https---raw.githubusercontent.com-composer-composer-main-res-composer-schema.json(路径因 Composer 版本略有差异,可用composer config --list | grep home查COMPOSER_HOME)
替代方案:用 jsonschema 工具做纯本地校验
如果离线环境长期存在,且你只需要基础结构检查(不校验包名合法性、版本约束语义等 Composer 特有逻辑),可以绕过 Composer 自身:
- 下载官方 schema:
curl -o composer-schema.json https://raw.githubusercontent.com/composer/composer/main/res/composer-schema.json - 用
jsonschemaCLI(Python)验证:jsonschema -i composer.json composer-schema.json
这个方式完全不依赖 Composer 运行时,但不会报 require 里写了不存在包这种业务级错误——它只管 JSON 结构合规性。
离线验证真正卡住的点,往往不是命令怎么写,而是 schema 缓存有没有被悄悄“预热”过。没连过网的机器,--offline 就是个空转开关。










