vendor目录为空或不完整,主因是composer.lock中dist.sha256哈希值与新下载包不匹配导致静默跳过安装,需同步删除vendor/和composer.lock后执行composer install --no-cache --force-checksums重装。

缓存清理后 vendor/ 为空或不完整
执行 composer clear-cache 本身不会动 vendor/,但很多人顺手一起删了 vendor/ 却忘了重装。现象是 require_once 'vendor/autoload.php' 报错,或 Class not found。
检查步骤:
- 运行
ls -A vendor(Linux/macOS)或dir vendor(Windows),确认目录非空且含autoload.php和composer子目录 - 若为空或缺失关键包,别急着再清缓存,先确认
composer.lock是否还在——它必须存在,否则composer install会重新解析依赖树,可能升版、冲突 - 执行
composer install --no-cache --force-checksums:--no-cache 强制跳过本地 ZIP,--force-checksums 让校验失败立刻中断,避免写入损坏的包
composer.lock 中 dist.sha256 与缓存 ZIP 不匹配
这是最隐蔽也最常被忽略的环节。你删了缓存 ZIP,但没删 composer.lock,而它里面硬编码了旧 ZIP 的 dist.sha256 值。Composer 拿新下载的 ZIP 去比对旧哈希,必然失败,然后静默跳过安装——vendor/ 看似“装完了”,实则缺包。
验证方式:
- 找一个报错的包(比如
symfony/console),在composer.lock中搜索它的dist.sha256字段 - 手动下载对应 ZIP:
curl -L "https://mirrors.aliyun.com/composer/dists/symfony/console/6.4.0.0/zip" -o /tmp/console.zip - 计算哈希:
sha256sum /tmp/console.zip,对比是否与 lock 文件中一致 - 不一致?说明 lock 文件已过期,必须同步删掉
composer.lock和vendor/,再重装
镜像源配置未生效却误以为已修复
缓存清完,composer install 仍卡在 Resolving dependencies 或报 Could not resolve host: packagist.org,大概率是镜像根本没接管请求。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
排查三要素(缺一不可):
- 键名必须是
repo.packagist,不是repos.packagist(多一个s就无效) - type 值必须显式写
composer:composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ - URL 结尾不能带
/packages.json,正确结尾是/composer/(阿里云)或根路径(腾讯云) - 验证是否生效:跑
composer install -vvv,搜日志里有没有Downloading https://mirrors.aliyun.com/...;若仍见packagist.org,说明配置没落进全局 config.json
CI/CD 中用户权限错配导致 vendor/ 写入失败
Jenkins 或 GitLab CI 跑 composer install 后 vendor/ 权限混乱,PHP 进程读不到类,错误信息常含 Permission denied 或 failed to open stream。
根本原因不是缓存,而是构建时用了 root 用户写 vendor/,但运行时用的是 www-data 或 gitlab-runner 用户。
安全做法:
- 禁止在 CI 中用
sudo composer install - 确保所有
composer命令都以目标运行用户身份执行(如 GitLab CI 的before_script中加chown -R $USER:$USER $CI_PROJECT_DIR) - 更稳方案:用
COMPOSER_CACHE_DIR="$CI_PROJECT_DIR/.composer-cache"隔离缓存,同时rm -rf vendor后再装,避免跨 Job 权限污染
composer.lock 和 vendor/ 之间的哈希契约失效,或是镜像配置写对了但没被 Composer 实际加载——这两点不验证清楚,反复清缓存只是原地打转。

















