composer install 总是重新下载包是因为默认缓存未启用或失效,需检查缓存路径权限、禁用--no-cache、确保prefer-dist模式及清除损坏缓存。

composer install 为什么总是重新下载包?
因为默认不启用本地缓存,每次 composer install 都会从远程仓库拉取 ZIP 或通过 Git 克隆,尤其在 CI/CD 或多项目开发时明显变慢。Composer 其实自带缓存机制,但需要确认是否启用、路径是否可写、缓存是否被绕过。
- 检查是否启用:
composer config --global cache-dir查看路径,确保该目录存在且当前用户有读写权限 - 常见坑:Docker 容器内未挂载缓存目录,或 CI 环境清空了
$HOME导致全局配置丢失 - 如果用
--no-cache参数(比如某些 CI 脚本硬编码),缓存会被强制禁用,需删掉该参数
如何让 composer 使用本地已有的 vendor 包?
Composer 不支持直接复用其他项目的 vendor/ 目录,但可通过 composer install --prefer-dist + 缓存机制实现“本地已有就跳过下载”。前提是包以 dist 方式安装(即 ZIP 归档),而非 source(Git 克隆)。
JTBC CMS(5.0) 是一款基于PHP和MySQL的内容管理系统原生全栈开发框架,开源协议为AGPLv3,没有任何附加条款。系统可以通过命令行一键安装,源码方面不基于任何第三方框架,不使用任何脚手架,仅依赖一些常见的第三方类库如图表组件等,您只需要了解最基本的前端知识就能很敏捷的进行二次开发,同时我们对于常见的前端功能做了Web Component方式的封装,即便是您仅了解HTML/CSS也
-
--prefer-dist是默认行为,但某些composer.json中写了"preferred-install": {"*": "source"},会绕过缓存,需删掉或改为"dist" - 缓存命中条件:包名 + 版本号 + dist URL 的 SHA256 值一致;若 packagist.org 上包更新了 ZIP URL,旧缓存失效,会重新下载
- 手动验证缓存是否生效:运行
composer install -v,看到Downloading <code>xxx.zipfrom cache 行才表示真用了缓存
缓存路径被占用或磁盘满导致失败怎么办?
缓存写入失败时,Composer 通常静默降级为直连下载,不会报错,但你会感觉“缓存没起作用”。真实错误藏在 verbose 日志里,比如 Failed to create cache directory: /home/user/.composer/cache/files。
- 检查磁盘空间:
df -h $(composer config --global cache-dir) - 修复权限:
chown -R $USER:$(id -gn) $(composer config --global cache-dir) - 临时换路径(如 CI 中):
composer config --global cache-dir /tmp/composer-cache,但注意 /tmp 可能被定时清理 - 清除损坏缓存:
composer clear-cache,它会删掉所有内容并重建目录结构
在 Docker 或 CI 中稳定启用缓存的关键点
Docker 构建层默认不保留缓存目录,CI 工作流也常重置环境变量,导致 Composer 每次都从零开始。必须显式挂载或配置。
- Dockerfile 中不要用
RUN composer install单独一层,应把composer.json复制后立即运行 install,并确保缓存目录在构建阶段可用(例如用--cache-dir指向/tmp/cache) - GitHub Actions 示例片段:
composer config --global cache-dir $HOME/.composer/cache必须在run步骤中执行,不能只靠 setup-php action 默认配置(某些版本不自动启用) - 私有包场景下,若用
repo.packagist.com类型仓库,缓存仍有效;但若用path仓库类型(本地文件路径),则完全不走缓存逻辑









