在 composer.json 的 "scripts" 中直接定义键值对即可创建命令别名,键为别名(区分大小写、避免特殊字符),值为字符串或数组形式的命令;支持 {$argv} 透传参数(仅限字符串值);可被钩子通过 @ 引用,但不支持传参;跨平台建议优先使用 php 脚本。

composer scripts 里怎么写命令别名
直接在 composer.json 的 "scripts" 字段里加键值对,键就是你敲的别名,值是实际要执行的命令(字符串或数组)。别名不是额外插件,也不用注册——只要写进去,composer run-script xxx 或更短的 composer xxx 就能触发。
常见错误现象:composer mytask 报错 “Script not found”,大概率是没把脚本名写进 "scripts" 对象顶层,或者手误加了多余缩进、逗号位置错导致 JSON 解析失败。
- 别名必须是合法的 JSON 键名,避免空格、斜杠、点号;推荐用短横线(
build-dev)或下划线(test_unit) - 值可以是字符串(如
"phpunit --testsuite unit"),也可以是数组(支持多条命令顺序执行) - 如果命令含空格或特殊字符,不用额外转义——JSON 字符串本身已处理,但引号得配对
- 别名不区分大小写?不。Composer 区分大小写,
Test和test是两个不同脚本
如何让自定义命令支持参数传递
默认情况下,composer xxx arg1 arg2 中的 arg1 arg2 不会自动透传给脚本命令。必须显式用 {$argv} 占位符,且只在值为字符串时生效(数组形式不支持参数透传)。
使用场景:写一个通用清理命令,想指定删哪个目录;或跑测试时动态传测试组名。
- 正确写法:
"clean": "rm -rf {$argv}",然后运行composer clean var/cache - 错误写法:
"clean": ["rm -rf", "{$argv}"]—— 数组不解析占位符,{$argv}会被当字面量执行 -
{$argv}是 Composer 内置变量,不是 shell 变量,不能写成$1或${1} - 如果脚本值是数组,又想传参,只能改用包装脚本(比如调用
php clean.php {$argv},再由 PHP 解析)
script 执行时机与事件钩子冲突怎么办
如果你在 "scripts" 里既写了独立别名(如 "cs-fix"),又配置了事件钩子(如 "post-install-cmd"),它们互不干扰——除非你手动在钩子里调用了那个别名。
容易踩的坑:以为 composer install 会自动运行你写的 "cs-fix",结果什么都没发生。它不会,除非你把它加进 "post-install-cmd" 数组里。
- 钩子字段名是固定关键词(
pre-autoload-dump,post-update-cmd等),别名是任意自定义键,二者不在同一命名空间 - 别名可被钩子调用,例如:
"post-update-cmd": ["@cs-fix", "@test"]—— 注意前面加@表示引用其他 script - 用
@引用时,不支持传参(@cs-fix --dry-run无效),参数只能走原始调用路径 - 钩子执行失败,默认中断后续流程;而手动运行别名失败,只报错退出,不影响其他命令
Windows 下 script 命令执行失败的典型原因
最常卡在路径分隔符和 shell 差异上:Composer 在 Windows 默认调用 cmd.exe,不识别单引号、$()、反引号,也不原生支持 rm -rf 这类 Unix 命令。
性能/兼容性影响:强行用 bash -c "rm -rf ..." 虽然可行,但会多启一个进程,且依赖 Git for Windows 或 WSL 安装,CI 环境容易挂。
- 跨平台安全写法优先用 PHP 脚本,例如
"clean": "php ./scripts/clean.php" - 必须用 shell 命令时,Windows 用户建议统一用
del /q /s+rmdir组合,而不是硬塞rm - 别在 script 里写
export FOO=bar && php script.php——cmd.exe不支持export,也不会连贯执行 - 检查
composer config --list | findstr bin-dir确认 bin 路径是否含空格,有则需用双引号包裹调用路径("php \"vendor/bin/phpunit\"")
composer.json 却忘了同步文档,或者在 CI 里用 macOS 本地调试过的命令,扔到 Windows runner 上就哑火——这些地方没日志、不报具体错误,得靠人盯。










