composer run-script 脚本未执行,主因是未显式调用或配置错误:脚本名拼写/大小写/位置(必须在 scripts 字段顶层)不符、未定义在 composer.json 中,或路径/环境/参数传递不当。

composer run-script 为什么脚本没执行
脚本没执行,基本是因为你没真正触发它——composer run-script 不是“保存配置就自动跑”,它只响应显式调用,且严格依赖 composer.json 中的定义位置和拼写。
常见错误现象包括:
-
Script not found: xxx:脚本名大小写不一致、多空格、用了中文标点,或被意外注释掉 - 命令敲对了但无输出:脚本值写在
extra或config下(必须在顶层scripts字段) - 本地能跑 CI 报
command not found:脚本里直接调phpunit,但没走vendor/bin/phpunit,CI 环境 PATH 没配全局二进制
验证是否生效最简单的方法是运行 composer run-script --list,它会列出所有已注册的脚本名,没出现在这里就等于没定义成功。
PHP 脚本里怎么安全加载项目类
直接 new App\Console\DeployCommand() 会报 Class not found,因为 composer run-script 默认不引入 vendor/autoload.php —— 这不是 bug,是隔离设计。
正确做法是在 PHP 脚本开头手动加载:
require_once __DIR__ . '/../../vendor/autoload.php';
注意路径要对:__DIR__ 是脚本所在目录,不是 composer.json 目录;如果脚本放在 scripts/deploy.php,那 ../../vendor/autoload.php 才是正确的相对路径。
其他要点:
- 别用
include单个类文件,容易漏依赖或版本错乱 - 不要依赖
$_ENV,环境变量需显式读取:getenv('APP_ENV')或通过$_SERVER['COMPOSER_ARGS']接收传参 - 如果脚本需要访问
composer.json内容,用file_get_contents(__DIR__ . '/../../composer.json')解析,别硬编码配置
钩子(如 post-install-cmd)和自定义脚本名混用时的陷阱
你写了 "post-install-cmd": "php scripts/install.php",又另定义了 "deploy": "php scripts/deploy.php",结果发现 composer install 后 install.php 没跑——大概率是钩子名拼错了。
内置钩子名严格区分大小写和连字符,比如:
-
post-install-cmd✅(标准写法) -
postinstallcmd❌(Composer 静默忽略) -
PostInstallCmd❌(大小写不匹配)
另外要注意执行顺序和失败行为:
-
pre-*钩子失败 → 主命令(如install)立即中止 -
post-*钩子失败 → 默认只警告,主流程继续,除非加了--no-interaction或设置了COMPOSER_NO_INTERACTION=1 - 多个脚本共用一个钩子时,用数组写法:
"post-update-cmd": ["MyScript::clearCache", "php artisan config:clear"],顺序执行,前一个失败则后一个跳过
参数怎么透传给 PHP 脚本
想让 composer run-script test -- --filter=MyTest 中的 --filter=MyTest 真正被脚本拿到,关键在双横线 -- 的位置和脚本内的接收方式。
错误写法:composer run-script test --filter=MyTest → --filter 被 Composer 当作自身参数吃掉了。
正确写法必须带分隔符:composer run-script test -- --filter=MyTest。
在 PHP 脚本里,推荐用以下方式获取参数:
- Composer 4.0+ 提供
$_SERVER['COMPOSER_ARGS'],返回已解析的参数数组,最可靠 - 兼容旧版可 fallback 到
getenv('COMPOSER_ARGS')(字符串,需explode(' ', ...)) - 避免直接用
$argv,索引可能偏移(Composer 会往前面塞自己的参数)
Windows 用户特别注意:CMD 下双引号必须全角或转义,否则 composer run-script "test -- --filter=Foo" 会被截断;PowerShell 更稳妥。
最常被忽略的一点:脚本执行时工作目录(cwd)固定为 composer.json 所在目录,不是脚本所在目录。路径相关的操作(如读配置、写日志)务必基于这个前提写相对路径,否则本地测试通过、CI 上就出错。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











