composer run-script test 本质是执行 composer.json 中 scripts.test 的值,而非直接运行 phpunit;其行为取决于该值的具体内容,如 "phpunit" 或 "vendor/bin/phpunit",并需注意 path、环境、参数透传(必须用 -- 分隔)、钩子触发及跨平台兼容性。

composer run-script test 本质是调用 scripts.test,不是直接跑 phpunit
它只是从 composer.json 的 scripts 字段里找键名为 test 的值,然后执行——值写的是什么,就跑什么。如果写成 "test": "phpunit",那它就去 PATH 里找 phpunit;如果写成 "test": "vendor/bin/phpunit",就明确走项目本地二进制。
常见错误现象:Command "phpunit" is not defined 或静默退出,大概率是因为脚本值没对上环境:
-
phpunit没装进require-dev,或没运行composer install --dev,vendor/bin/phpunit根本不存在 - Windows CMD 下写
phpunit找不到命令(不识别 PATH),得用vendor/bin/phpunit.bat或改用 PowerShell - 脚本值是数组(如
["@test:unit", "@test:static"]),但 Composer 版本低于 7,不支持
参数必须用 -- 显式分隔,否则会被 Composer 吃掉
composer run-script test -- --filter=FooTest 是唯一可靠写法。中间那个 -- 是硬性分隔符:前面属于 Composer 自己的选项,后面才透传给 phpunit 进程。
错误写法包括:
-
composer run-script test --filter=FooTest→--filter被 Composer 当作自身参数,报错或忽略 -
composer run-script test -- --filter="My Class"→ Windows CMD 里双引号容易解析失败,建议改用 PowerShell 或单引号 -
composer run-script test -- -v→ 短参数也得靠--隔开,否则不生效
PHP callable 类型脚本(如 "test": "My\TestRunner::run")会把 -- 后参数自动塞进 $argv,但 shell 类型脚本需手动处理 $@。
别手敲 run-script,优先用 composer test 或 composer run test
composer test 是 composer run-script test 的语法糖,自动触发 pre-test 和 post-test 钩子,且更少出错——它强制要求你用 -- 分隔参数,不会让你漏掉。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
composer run test 更现代,支持 --list、--no-dev 等新参数,而 run-script 在 Composer 2.0+ 已被标记为 deprecated,执行时会输出警告。
只有两种情况才需要显式敲 run-script:
- 脚本名含冒号或破折号(如
"ci:lint"),composer ci:lint会报错,必须写composer run-script "ci:lint" - 想跳过钩子,只跑脚本本身,得加
--no-hooks(composer run不支持这个开关)
工作目录和环境变量默认不继承,跨平台尤其要小心
Composer 脚本默认在项目根目录执行,但不会自动加载 .env,也不继承当前 shell 的 $PATH。CI 环境里 “本地能跑、CI 报 command not found” 多半出在这儿。
安全做法:
- 所有路径写相对路径:
"test": "./vendor/bin/phpunit",别依赖PATH - 需要环境变量?显式导出:
"test": "APP_ENV=testing ./vendor/bin/phpunit",或用phpdotenv在 PHP 脚本里加载 - Windows 下避免管道、重定向等 shell 特性,数组格式更稳:
"test": ["./vendor/bin/phpunit", "--colors=always"]
脚本每次执行都会重新加载 Composer autoloader,频繁调用低效命令(比如重复 composer dump-autoload)会拖慢流程——这种逻辑应该抽到独立 PHP 脚本里,再从 scripts 中调用。










