composer run-script 通过匹配 composer.json 中 scripts 字段的键名执行对应脚本,需预先定义如 "test": ["vendor/bin/phpunit"],不自动识别测试工具,且必须确保路径正确、依赖已安装(含 --dev),避免混入 post-install-cmd。

composer run-script 怎么调用测试命令
直接执行 composer run-script 就能触发自定义测试脚本,但必须先在 composer.json 的 scripts 里定义好。它不自动识别 phpunit 或 codecept,得你手动绑定。
常见错误是写了 "test": "phpunit" 却没装 phpunit 到 vendor/bin/,导致报错 Command "phpunit" is not defined。正确做法是用相对路径或加 vendor/bin/ 前缀。
- 推荐写法:
"test": ["vendor/bin/phpunit", "--colors=always"] - 如果用了 Codeception:
"test:acceptance": "vendor/bin/codecept run acceptance" - 支持多命令串联,用数组形式(顺序执行);单字符串则会被 shell 解析,跨平台风险高
- 别漏掉
--dev安装依赖:运行前确保已执行composer install --dev
post-install-cmd 和 test 脚本混用要注意什么
很多人想让 composer install 后自动跑测试,于是把 phpunit 塞进 post-install-cmd。这看似省事,实际会拖慢安装流程、掩盖真实环境问题,CI 场景下还可能因超时失败。
真正该进 post-install-cmd 的是初始化类操作(如 php artisan key:generate),不是验证性动作。测试属于「验证阶段」,应独立触发。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
post-install-cmd适合做环境准备,比如生成密钥、清缓存、建符号链接 - 测试脚本建议单独命名(如
"test"、"test:ci"),由 CI 配置显式调用 - 若硬要集成,至少加
--no-interaction和超时控制,避免卡住 - Laravel Dusk 等浏览器测试更不能放进去——它们依赖 ChromeDriver,install 阶段大概率没就绪
PHP 类型脚本怎么写才能被 composer 正确调用
当测试逻辑变复杂(比如要读配置、跳过某些环境、聚合报告),直接写 shell 命令就难维护了。这时该用 PHP 类静态方法,Composer 支持直接调用 Class::method。
关键点在于:方法必须是 public static,且参数只能是 ComposerScriptEvent 对象(可选)。否则会报 Call to undefined method。
- 示例声明:
"test:with-report": "App\Scripts\TestRunner::runWithCoverage" - 对应 PHP 文件需在自动加载范围内(比如
app/Scripts/TestRunner.php,且autoload已配好 PSR-4) - 方法体内可用
$event->getIO()输出日志,比echo更兼容 Composer 的输出控制 - 别在方法里 exit() 或 die() —— Composer 会认为脚本异常退出,后续钩子可能中断
为什么 vendor/bin/phpunit 在某些 CI 环境里找不到
根本原因是 vendor/bin/ 不在系统 $PATH,而 Composer 脚本默认用 shell 执行,不自动补全路径。尤其在 Alpine Linux、GitLab Runner 默认镜像等精简环境中高频出现。
这不是权限问题,也不是没装 PHPUnit,而是执行上下文缺失路径信息。
- 最稳解法:改用
php vendor/autoload.php+ 入口文件,或直接写php ./vendor/phpunit/phpunit/phpunit - 临时修复:在 CI 脚本开头加
export PATH="$PWD/vendor/bin:$PATH" - Docker 场景下,可在
Dockerfile里用ENV PATH="/app/vendor/bin:$PATH" - 别依赖
phpunit全局命令——它和项目所用版本可能不一致,造成误判
scripts 里判断 $_SERVER['CI'] 或写条件分支,就该考虑拆成独立 CLI 工具了。










