Composer可通过scripts字段定义命令别名,支持字符串或数组形式,用composer run执行;可添加description字段说明用途,推荐使用$COMPOSER_BIN_DIR等变量提升可移植性,避免硬编码和复杂逻辑。

在 composer.json 里用 scripts 定义别名
Composer 本身不支持全局命令别名,但可以通过 scripts 字段为常用命令创建简短别名。这些脚本会出现在 composer run(或旧版 composer run-script)可调用列表中。
比如你想把 php artisan migrate --seed && php artisan optimize:clear 缩成一个词执行,就把它写进 composer.json 的 scripts 对象里:
"scripts": {
"dev:setup": [
"php artisan migrate --seed",
"php artisan optimize:clear"
]
}
之后运行 composer run dev:setup 就能一次性执行全部步骤。
- 脚本值可以是字符串(单条命令)或数组(多条顺序执行)
- 数组内每项都会独立执行,任一失败则后续停止
- 支持
@composer、@php等内置别名,比如"@php -v" - 注意 Windows 下路径分隔符和 shell 特性可能影响命令拼接
使用 composer run -l 查看所有可用脚本
composer run -l 会列出当前项目定义的所有脚本及其描述(如果加了 description 字段)。
你可以在 scripts 里为每个脚本加注释,方便团队理解用途:
"scripts": {
"test:unit": {
"script": "vendor/bin/phpunit --testsuite=Unit",
"description": "Run unit tests only"
}
}
这样 composer run -l 输出就会包含那句描述。
- 没有
description的脚本只显示名字,容易混淆 - 脚本名含冒号(如
dev:build)只是命名习惯,无语法特殊含义 -
composer run默认不带-l时,必须指定脚本名,否则报错
避免在脚本中硬编码路径或参数
直接写死 vendor/bin/phpunit 或 --filter=testSomething 会让脚本难以复用。更灵活的方式是用环境变量或 Composer 自带的占位符。
- 用
$COMPOSER_BIN_DIR替代硬编码vendor/bin,例如:"$COMPOSER_BIN_DIR/phpunit" - 允许用户传参:在脚本命令末尾加
-- {@},调用时用composer run test -- --filter=foo - PHP 脚本类命令建议封装成独立可执行文件,再由 script 调用,而不是塞一堆逻辑进 JSON 字符串里
- 别在 script 里写条件判断(如
if [ $CI ]; then ...),跨平台兼容性差,也难调试
Windows 下 composer run 执行失败的常见原因
Windows 用户常遇到 'php' is not recognized 或脚本直接跳过不执行,多数和 shell 解析方式有关。
- PowerShell 默认不识别
&&连接符,改用;或拆成多个 script 条目 - 确保
php已加入系统 PATH,或改用绝对路径(如C:/php/php.exe) - 路径含空格时,务必用双引号包裹整个命令,例如:
"\"C:/Program Files/PHP/php.exe\" -v" - 某些防病毒软件会拦截
composer run启动的子进程,临时禁用测试是否缓解
复杂逻辑别强塞进 scripts,该写 PHP 脚本就写,composer.json 不是 shell 脚本替代品。










