CI中test脚本执行前composer install未运行,根本原因是Composer v2.2+在COMPOSER_DEV_MODE=0(CI默认)时静默禁用所有post-install-cmd等命令事件;必须将composer install作为独立步骤显式执行,并严格使用--no-dev --optimize-autoloader --classmap-authoritative --no-interaction参数,否则易引发类加载失败、性能下降或dev包混入生产等问题。

CI里test脚本执行前,composer install没跑怎么办
根本不是脚本写得不对,而是CI环境默认不触发post-install-cmd——Composer v2.2+起,只要COMPOSER_DEV_MODE=0(CI里默认就是),所有命令事件都被静默禁用。
直接在test脚本里加composer install也不行:它可能重复执行、漏参数、或因缓存失效导致类加载失败。
- 必须把
composer install作为独立步骤显式执行,且放在test之前 - 参数不能少:
--no-dev --optimize-autoloader --classmap-authoritative --no-interaction - 别依赖
post-install-cmd自动调用测试——它在CI里基本不生效
composer install参数漏一个,test就可能挂
CI里跑composer install只写命令名,等于埋雷。线上类找不到、autoload慢、dev包混进生产,全因参数缺失。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
--no-dev:跳过require-dev里的phpunit等,否则test脚本可能因路径错乱或版本冲突失败 -
--optimize-autoloader:生成vendor/composer/autoload_classmap.php,否则PSR-4动态扫描会让phpunit启动变慢甚至超时 -
--classmap-authoritative:强制信任类映射表,避免Class not found错误——尤其当测试用到非标准命名空间时
如何让test脚本真正“等”composer install完成
GitHub Actions或GitLab CI里,步骤是串行的,但脚本内部没依赖关系。如果test脚本里写了phpunit却没确认autoload已就绪,就会报Class 'PHPUnit\Framework\TestCase' not found。
- 在CI配置中,把
composer install和composer run test拆成两个独立run步骤,确保顺序 - 加一句验证:安装后跑
php -r "include 'vendor/autoload.php'; echo 'OK';",失败直接中断流程 - 别在
test脚本里再调composer install——它不该承担环境准备职责
本地composer test能跑,CI里失败的常见原因
不是代码问题,是环境差异。本地有vendor/、有交互模式、有dev依赖;CI里什么都没有,全靠命令补全。
- 检查CI日志开头有没有
ls -la输出,确认composer.json和composer.lock真被检出了 - 确认PHP扩展齐全:
mbstring、xml、zip缺一不可,否则composer install直接退出 -
composer validate --strict必须加在CI第一步,防止composer.json和lock不匹配导致后续全崩
COMPOSER_DEV_MODE=0这个隐性开关——它让所有钩子失效,而很多人还在脚本里写"post-install-cmd": ["@test"],指望它自动触发。

















