composer test不是内置命令,仅当composer.json的scripts中明确定义"test"键(如"test": "vendor/bin/phpunit")时才存在;未定义则报错“Command 'test' is not defined”。

composer test 命令为什么报 “Command not defined”
因为 composer test 不是 Composer 内置命令,它只在 composer.json 的 scripts 字段里明确定义了 "test" 键时才存在。没配就跑,必然报错。
- 检查
composer.json是否在顶层scripts下写了"test": "vendor/bin/phpunit"或类似值 - 键名必须是纯英文、数字、下划线,不能含空格或中文(如
"测试"会被忽略) - 若用
composer run test,需确认 Composer 版本 ≥ 2.2;旧版只能用composer run-script test - 执行前确保已装 PHPUnit:运行
composer require --dev phpunit/phpunit:^10.5(按 PHP 版本选对应大版本)
scripts 里调用 phpunit 怎么传参才不翻车
Composer 不解析参数,所谓“传参”本质是把 $@ 透传给底层命令。漏掉占位符或分隔符错位,参数就丢进黑洞。
- 脚本定义必须显式写
$@:"test": "vendor/bin/phpunit --colors=always $@" - 运行时用两个
--分隔:composer test -- --filter=testLogin(第一个--给 Composer,第二个给 phpunit) - Windows 用户避免直接用
$@,改用cross-env包装或统一走composer run test -- --filter=xxx - 别在脚本里硬编码路径如
./vendor/bin/phpunit,用vendor/bin/phpunit或直接phpunit(确保vendor/bin在PATH中)
post-install-cmd 为什么 CI 里总不触发
它不是“每次 composer install 都跑”,而是仅当 composer.lock 变更或 vendor/ 不完整时才执行。CI 缓存复用导致它静默跳过,是常见盲区。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- CI 中反复执行
composer install但 lock 未变 →post-install-cmd根本不运行 -
--no-dev会默认禁用所有开发期钩子,包括post-install-cmd(即使你没显式加该 flag,COMPOSER_NO_DEV=1同样生效) - 解决方案:把关键逻辑抽成独立脚本,比如
"ci:test": "phpunit --no-coverage",CI 步骤中显式调用composer run ci:test - 若必须用钩子,加前置断言:
"post-install-cmd": ["php -r "if (!file_exists('vendor/autoload.php')) exit(1);""],确保环境就绪
scripts 里 new 类报 Class not found 怎么办
Composer 执行 scripts 时默认不加载 autoload.php,new AppServicesChecker() 这类调用必然失败——这不是命名空间写错,是设计如此。
- PHP 脚本第一行必须手动引入:
require __DIR__ . '/../vendor/autoload.php';(路径按脚本实际位置调整) - 加防护判断:
if (!class_exists('ComposerAutoloadClassLoader')) { die('autoload not loaded'); } - 回调方式写法(如
"health:check": "App\Scripts\HealthCheck::run")要求类已注册在autoload或autoload-dev中,且方法为public static - 避免在脚本里依赖
$_ENV或未初始化的 Laravel Facade,CLI 环境下它们多数未就绪
真正要跑通测试链路,关键不在“怎么写”,而在“谁来触发”。CI 工具负责流程控制,Composer scripts 只管 PHP 层确定性操作。把 phpstan、phpcs、phpunit 封装成语义清晰的脚本名,再让 CI 显式调用,比塞进钩子里更稳、更易调试。

















