composer run-script 是 composer run 的已弃用别名,应改用 composer run 或直接 composer [script-name];它不支持新参数且会输出警告。

直接说结论: composer run-script 不是独立命令,它只是 composer run 的别名(从 Composer 2.0 开始),真正执行的是 scripts 段定义的脚本;多数情况下,你应该直接用 composer run 或更简洁的 composer [script-name]。
为什么 composer run-script 基本不用了
Composer 2.0 起把 run-script 命令标记为“deprecated”,并重定向到 run。运行 composer run-script build 实际等价于 composer run build,但前者会输出警告:
Deprecated: The "run-script" command is deprecated. Use "run" instead.
- 不是报错,但 CI/CD 日志里会出现,影响可读性
- 官方文档已全面替换为
composer run -
run-script不支持--list、--no-ansi等新参数
怎么正确运行自定义脚本(composer.json 中的 scripts)
脚本必须先在 composer.json 的 scripts 字段里声明,例如:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
{
"scripts": {
"dev-start": "php -S localhost:8000 -t public",
"test": ["@php vendor/bin/phpunit", "--colors=always"],
"build": "npm run build && cp dist/* public/"
}
}
- 单行命令直接写字符串;多步骤用数组,按顺序执行
- 以
@开头的命令(如@php)会递归调用其他脚本,避免 shell 解析歧义 - 脚本名不能含空格或特殊字符,否则无法通过
composer xxx直接触发 - 想传参?用双横线:
composer run test -- --filter=MyTest,后面部分透传给脚本进程
composer run 和直接 composer [script-name] 有啥区别
两者功能一致,但行为细节不同:
-
composer test:最简写法,仅匹配顶层脚本名;不支持通配符、不显示详细执行日志 -
composer run test:支持--list查看所有脚本、--no-dev跳过 dev-only 脚本、--parse预检语法 - 如果脚本名和内置命令冲突(比如你定义了
"install": "echo 'hi'"),composer install仍会执行原生 install 逻辑,除非加--no-plugins—— 这点极易误判
常见坑:脚本不执行、环境变量失效、Windows 下路径出错
这些问题几乎都源于执行上下文和 shell 行为差异:
- 脚本默认在项目根目录运行,但
npm、php等命令可能依赖PATH;CI 中建议显式指定完整路径,比如/usr/bin/npm run build - Windows 用户注意:
composer run在 Git Bash / MSYS2 下会尝试调用 bash,但若系统没装 bash,会 fallback 到 cmd —— 此时&&、$()等语法直接失败 - 环境变量不会自动继承父 shell 的 export 结果;需要在脚本中重新
export,或改用"test": "APP_ENV=test vendor/bin/phpunit" - 脚本退出码非 0 时,Composer 默认中断后续操作;加
--no-interaction不起作用,得靠|| true显式忽略
真正麻烦的从来不是怎么写脚本,而是搞清它在哪种 shell 下、以什么用户权限、带着哪些环境变量跑起来 —— 尤其当本地能过、CI 报错时,先 composer run --no-dev echo $PATH 看一眼实际环境再说。

















