必须加-vvv才能看到真实错误:它会暴露子进程的Fatal error、ParseError等运行时问题,否则仅显示“Script failed with error code 1”;-vvv还显示完整命令、环境变量及stderr原始输出。

报错只显示“Script failed with error code 1”怎么办
默认情况下 Composer 会吞掉子进程的真实错误输出,你看到的只是外壳失败信号。不加 -vvv,永远看不到 PHP Fatal Error、Class not found 或 parse error 这类运行时崩溃点。
必须加 -vvv 才能暴露真实问题:
-
composer require monolog/monolog -vvv会打印每条执行命令、环境变量、以及子脚本 stdout/stderr 的原始内容 - 一旦看到
Fatal error: Uncaught Error或ParseError,说明问题不在依赖解析,而在 require 的脚本本身(比如 post-install-cmd 调用的 PHP 文件) - Linux/macOS 下注意检查脚本开头是否有
#!/usr/bin/env php和可执行权限;Windows 上建议显式写"php script.php",避免系统找不到解释器
“Your requirements could not be resolved”该看哪几行
这行红字只是结论,不是原因。真正关键的是它前面几行里反复出现的包名和版本号,尤其是带 Because... 和 conflicts with... 的推理链。
重点盯住三处:
- 末尾倒数 5 行内出现的
Found conflicting requirements—— 它直接指出哪两个包互斥 - “Root requirements”段落 —— 显示你
composer.json里哪一行触发了整条冲突链 - 重复高频出现的包(如
guzzlehttp/guzzle、symfony/console)—— 它们大概率是冲突枢纽,下一步就用composer why-not查它
为什么 composer why-not 必须配合目标包名一起用
composer why-not 不是泛泛排查,它只回答一个问题:“为什么我装不上 X?” 如果你没给 X,它就什么也不输出。
典型误用:
- 报错说装不上
laravel/framework:^10.0,却跑composer why-not laravel/framework(缺版本)→ 返回空 - 正确做法是
composer why-not laravel/framework:^10.0→ 输出第一行就是拦路包,例如spatie/laravel-backup v8.0 requires laravel/framework ^9.0 - 如果输出里有
requires php ^8.1,但你本地是 PHP 7.4,那就得同步查composer why-not php:8.1
报错里出现 “file could not be downloaded” 却没提具体 URL
这不是网络抽风,而是 Composer 在尝试从某个仓库拉元数据时失败,但默认不打印失败源地址。加 -vvv 后你会看到类似这样的日志:
Downloading https://packagist.org/packages.json Failed to download https://packagist.org/packages.json: file could not be downloaded
这时再结合你的镜像配置判断:
- 运行
composer config --global repos.packagist,确认是否还残留旧镜像地址(如阿里云) - 如果是,立刻执行
composer config -g --unset repos.packagist清除,并跟composer clear-cache - 若仍失败,检查
php --ini对应的php.ini是否配对了curl.cainfo,否则 TLS 握手会静默失败
-vvv 日志深处,而不是红字第一行。不加这个参数,等于蒙眼修车。


















