应优先使用composer run或composer [script-name],因composer run-script自composer 2.0起已被弃用,仅保留兼容性,不修复问题且ci中会输出警告。

直接用 composer run 或 composer [script-name],别碰 composer run-script ——它从 Composer 2.0 就被标记为 deprecated,只留兼容,不修问题,CI 日志里还会飘警告。
脚本名对不上?先查可用列表
执行前最该做的不是敲命令,而是确认脚本名真存在、拼写完全一致(大小写、短横线、引号都算):
-
composer run --list是唯一可靠方式,它列出所有当前项目scripts下可调用的键名 - 脚本名含冒号(如
ci:lint)或点号时,composer ci:lint会报错,必须用composer run-script "ci:lint"(注意双引号,Windows 下尤其关键) - 如果
--list不显示你的脚本,大概率是:composer.json没在当前目录、scripts字段缩进错误、或被意外写进了scripts-dev(Composer 默认不加载它)
传参总失败?记住那个双横线 --
想把 --filter=MyTest 传给 PHPUnit,漏掉中间的 -- 就全白搭:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 错误写法:
composer test --filter=MyTest→--filter被 Composer 当作自身参数,可能报错或静默忽略 - 正确写法:
composer test -- --filter=MyTest→ 第一个--是分隔符,后面才透传给脚本进程 - PHP 脚本里用
$argv接收,但注意:$argv[0]是脚本路径,你传的参数从$argv[1]开始;建议开头加array_shift($argv)去掉它再处理 - Shell 命令里用
$@,但记得引号包裹避免空格断开,比如"deploy": "bash deploy.sh \"$@\""
脚本执行没输出或报 Class not found?环境没加载
Composer 不会自动 require 项目 autoloader,脚本里直接 new 类或 use 命名空间,必报错:
- PHP 脚本第一行必须显式引入:
require __DIR__ . '/vendor/autoload.php'; - 别依赖全局
phpunit或npm,优先用vendor/bin/phpunit或./node_modules/.bin/eslint,路径写死更稳 - 调试时加个临时脚本:
"debug": "pwd && echo $PATH && which php && ls -l vendor/bin/",跑composer debug看真实执行上下文 - Windows 用户注意:Git Bash 下
&&和$()可能失效,fallback 到 cmd 后语法直接崩,建议脚本逻辑尽量用 PHP 实现
为什么推荐写 PHP 脚本而不是 shell 命令
字符串形式的 shell 命令(如 "build": "npm run build && cp dist/* public/")看着快,但跨平台、错误捕获、参数安全全靠运气:
- PHP 脚本能直接
require项目依赖,用try/catch捕异常,返回非零退出码让 Composer 中断后续流程 - 参数透传更可控:
composer build -- --env=prod→$argv里原样拿到,不用 shell 解析歧义 - 环境变量、路径、权限问题少一半:PHP 脚本默认在项目根目录执行,
__DIR__稳,./不飘 - 别写
"test": "phpunit"这种依赖 PATH 的命令,换成"test": "vendor/bin/phpunit"或封装成php tests/run.php
真正容易被忽略的点是:脚本执行时的 CWD 固定为 composer.json 所在目录,不是你当前终端位置;且 vendor/bin/ 会被自动加进 PATH 前置位——这两条决定了绝大多数“本地能跑、CI 报 command not found”的问题根源。










