直接运行 composer run-script 即可,无需“手动触发”;它本质是执行 composer.json 中 "scripts" 字段定义的命令别名,立即执行而非事件驱动。

直接运行 composer run-script 就行,不用“手动触发”这种说法
Composer 脚本本质就是配置在 composer.json 的 "scripts" 字段里的命令别名。所谓“手动触发”,其实就是你在终端里敲下 composer run-script xxx —— 它不是后台监听或事件驱动的机制,没有“触发时机”一说,就是立即执行。
常见误区是以为要先注册、监听或写钩子;其实只要脚本名存在且命令合法,run-script 就能跑起来。
composer run-script 的实际用法和参数细节
基本格式是:composer run-script 。方括号里的 -- 很关键:它用来分隔 Composer 自身参数和脚本实际接收的参数。
- 不加
--:后面的参数会被 Composer 解析(可能报错或被忽略) - 加
--:后面所有内容原样透传给脚本命令,比如 PHP 脚本里的$argv或 shell 脚本里的$@ - 脚本名区分大小写,且必须完全匹配
composer.json中定义的键名 - 如果脚本定义为数组(如
["@php", "foo.php"]),Composer 会依次执行;定义为字符串则直接交给 shell
示例:composer run-script post-install-cmd -- --force,其中 --force 会传给实际执行的命令(比如某个 PHP CLI 脚本)。
为什么有时提示 “Script not found” 却明明写了?
最常见原因不是拼写错误,而是当前目录不在项目根路径下 —— composer.json 必须存在且可读,Composer 不会向上递归查找。另外注意:
- 脚本名不能含空格或特殊字符(只建议用字母、数字、短横线、下划线)
- 如果用了
composer global run-script,它查的是全局composer.json,不是项目里的 - 某些 IDE 或 CI 环境默认工作目录不是项目根,需显式
cd进去再执行 - 脚本定义在
"scripts"下,不是"scripts-dev"或其他自定义字段(Composer 只认"scripts")
想让脚本支持传参又不想每次敲 --?改用 composer exec(Composer 2.5+)
如果你用的是 Composer 2.5 或更高版本,composer exec 是更自然的选择:它默认把所有后续参数透传,无需 -- 分隔。
例如定义脚本:"test": "php tests/run.php",那么:
-
composer run-script test -- --verbose✅ -
composer exec test --verbose✅(更简洁,推荐新项目用)
但要注意:exec 不会自动执行生命周期事件(如 pre-autoload-dump),它只跑你指定的脚本名;而 run-script 在某些上下文中(如安装后)会被自动调用,这点别混淆。










