Composer脚本报错无输出是因默认静默吞掉stderr,加--verbose参数可显示真实错误;需注意路径、权限、环境变量及避免递归调用composer命令。

Composer 脚本执行时直接报错退出,没输出任何信息
默认情况下,Composer 会静默吞掉脚本的 stderr,尤其当脚本里用了 exit 1 或抛出未捕获异常时,你只看到 “Script xxx handling the yyy event returned with error code 1”,但不知道哪行崩了。
解决办法是加 --verbose 或 -v 参数重跑:
composer run-script post-install-cmd -v
这样 stderr 就不会被屏蔽,能直接看到 PHP Notice、Fatal error 或 shell 命令的真实报错。如果脚本本身是 PHP 文件,还要确认它开头有没有 #!/usr/bin/env php 和可执行权限(Linux/macOS 下)。
- Windows 用户注意:
php script.php和script.php在scripts里写法不同,推荐显式写"php script.php",避免系统找不到解释器 - 脚本路径别用相对路径如
./scripts/deploy.php,Composer 当前工作目录不一定是项目根目录;统一用__DIR__或dirname(__FILE__)在脚本内做定位
脚本里调用 composer install 导致死循环或权限错误
在 post-autoload-dump 或 pre-install-cmd 里再触发 composer install,大概率会卡住或报 file_put_contents(./composer.lock): failed to open stream —— 因为锁文件正被父进程占用。
根本原则:不要在 Composer 脚本里递归调用 composer 命令。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 需要生成 autoload 或刷新依赖?改用
Composer\Autoload\ClassLoader::dump()或直接 requirevendor/autoload.php后操作 - 真要触发另一次安装(比如子模块),用
exec('cd subpath && composer install --no-interaction')并加超时和错误检查,但得确保子目录有独立composer.json - 权限问题常出现在 Docker 或 CI 环境:宿主机 UID 和容器内不一致,导致
vendor/目录属主错乱;建议在Dockerfile中固定 UID,或运行前加chown -R $(id -u):$(id -g) vendor/
scripts 里写的命令在终端能跑,但 Composer 执行就报 command not found
不是环境变量问题,而是 Composer 启动脚本时没加载 shell 配置(~/.bashrc、~/.zshrc),PATH 里没有你装的全局 bin(比如 phpcs、npm)。
最稳的解法:所有外部命令都写绝对路径。
- 用
which phpcs查到路径后,写成"/usr/local/bin/phpcs"而不是"phpcs" - PHP 脚本优先用
php ./script.php,别依赖 shebang + chmod,Windows 和某些 CI 不认 - Node.js 工具链更麻烦:CI 中
npm可能在/opt/nodejs/bin/npm,而本地在/usr/local/bin/npm;建议在脚本里先export PATH="/opt/nodejs/bin:$PATH"再调用
脚本执行成功但实际没生效,比如生成的文件不在预期位置
Composer 脚本默认在项目根目录执行,但如果你的 composer.json 放在子目录(比如 backend/composer.json),而你在项目根目录运行 composer install,那脚本实际工作目录仍是根目录,不是 backend/。
验证方式:在脚本开头加一行 echo getcwd(); 或 pwd 输出当前路径。
- 跨目录操作必须显式
chdir()到目标目录,或者所有路径都基于__DIR__构造,比如file_put_contents(__DIR__.'/../dist/config.php', $content) - Windows 下路径分隔符别硬写
\,用DIRECTORY_SEPARATOR或str_replace('/', DIRECTORY_SEPARATOR, $path) - 生成文件后记得检查返回值:
if (false === file_put_contents(...)) { throw new RuntimeException('Write failed'); },否则失败静默
脚本执行环境比想象中更“干净”——没有交互式 shell 的历史、alias、函数,PATH 狭窄,当前目录也不一定如你所想。每次怀疑脚本行为异常,第一件事就是加 echo getcwd(); print_r($_SERVER['PATH'] ?? []); 看现场。

















