必须同时缓存vendor/和~/.composer/cache,缺一不可;只缓存vendor/会导致每次重下zip包、重解压校验,耗时仍超2分钟。

vendor目录膨胀导致CI构建变慢,核心不是删文件,而是缓存没配对
CI里composer install耗时飙升,90%是因为只缓存vendor/却忽略~/.composer/cache。这两个路径必须同时缓存,缺一不可——前者是安装结果,后者是下载+解压+校验的前置过程。只缓存vendor/,每次构建仍要重走网络下载和ZIP解包流程。
- GitLab CI推荐写法:
cache:key: "$CI_JOB_NAME-php-${PHP_VERSION}-$(cat composer.lock | sha256sum | cut -d' ' -f1)",用composer.lock哈希 +PHP_VERSION前缀双重锁定 - 排除
vendor/bin/:该目录下全是符号链接,跨runner时容易指向错误路径,缓存时应显式排除 -
~/.composer/cache建议设为$HOME/.composer-cache-$PHP_VERSION,避免多PHP版本混用导致缓存污染
CI中反复出现Class not found,大概率是autoload.php路径硬编码失效
报Class 'MonologLogger' not found或require(): failed to open stream,不是类文件丢了,而是vendor/autoload.php里写的__DIR__指向了错误路径。常见于复制vendor、挂载宿主机目录、或软链vendor到共享位置后。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 绝对不要
cp -r vendor到另一台机器或另一个项目——__DIR__绑定的是源路径,复制后映射全错 - Docker中别bind mount
vendor,改用分层构建:COPY composer.json composer.lock .→RUN composer install --no-dev --optimize-autoloader - 若已出问题,运行
composer install --discard-changes比rm -rf vendor && composer install更快更稳,它按composer.lock精准还原,保留autoload缓存结构
多个子模块共用vendor时,别合并目录,改用PSR-4声明+主项目dump-autoload
WordPress插件、Laravel包、微服务聚合目录等场景下,每个子目录都放独立composer.json并各自composer install,只会放大冲突。正确做法是让所有子模块放弃自己的vendor,由主项目统一管理加载上下文。
- 子模块删掉自己的
composer.json(或仅保留autoload段),不执行composer install - 主项目
composer.json中用"autoload": { "psr-4": { "PluginFoo\": "plugins/foo/src/" } }显式声明路径 - 主项目运行
composer install --no-autoloader && composer dump-autoload,生成唯一vendor/autoload.php覆盖全部命名空间 - 子模块含私有依赖?必须通过
path repository注册到主项目,不能各自require,否则composer update会报Root package cannot require itself
vendor/bin命令调用错乱,不是PATH问题,是没显式指定路径
本地装了phpunit/phpunit:^10,但phpunit --version显示v9.6——这不是环境变量乱,而是系统按PATH顺序优先执行了全局版本。项目内必须切断对全局命令的依赖。
- 验证当前生效命令:
which phpunit(Linux/macOS)或where phpunit(Windows) - 检查脚本内容:
head -n 3 $(which phpunit),确认它require的是不是~/.composer/vendor/autoload.php - 项目内一律用
./vendor/bin/phpunit显式调用,CI脚本和composer scripts中也必须写全路径,例如"test": "./vendor/bin/phpunit" - 全局Composer工具(如
phpstan)和项目本地同名命令共存时,PATH顺序决定谁胜出,无法靠autoload修复










