Composer缓存目录默认为Linux/macOS的~/.composer/cache、Windows的%APPDATA%\Composer\Cache,实际路径须执行composer config --global cache-dir确认,受COMPOSER_CACHE_DIR环境变量最高优先级影响。

Composer缓存目录在哪?直接看生效路径
Composer缓存目录不是写死的,而是运行时动态推导的,默认位置取决于系统和环境变量。最可靠的方式是执行 composer config --global cache-dir,它会输出当前实际生效的路径:Linux/macOS 通常是 ~/.composer/cache,Windows 是 %APPDATA%\Composer\Cache。注意 ~ 指的是当前用户家目录,不是项目根目录,也不是 vendor/ 下的子目录。
如果你在 CI 或容器里看到缓存没命中,大概率是因为没显式设置 COMPOSER_CACHE_DIR,导致 Composer 仍往默认路径(如 /root/.composer/cache)写,而缓存动作却配置在另一路径上。
缓存内容分三层,每层作用不同
缓存目录下有三个核心子目录,各自承担不同职责,不能混为一谈:
-
files/:存放已下载的 ZIP/TAR 包归档(composer install时优先复用这里) -
repo/:缓存 Packagist 等仓库返回的 JSON 元数据(影响依赖解析速度) -
vcs/:Git/SVN 等 VCS 仓库的克隆副本(用于dev-master或dev-feature类分支安装)
其中 files/ 对网络带宽和下载耗时影响最大;repo/ 决定 composer update 是否要重新请求元数据;vcs/ 在使用私有 Git 仓库或 fork 时才真正起效。清理时可用 composer clear-cache files 单独清归档,避免误删元数据导致下次 update 变慢。
COMPOSER_CACHE_DIR 和 cache-dir 配置谁优先?
环境变量 COMPOSER_CACHE_DIR 的优先级高于 composer config --global cache-dir,但低于命令行参数 --cache-dir。也就是说:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 设了
COMPOSER_CACHE_DIR=/mnt/cache/composer→ Composer 默认走这个路径 - 但执行
composer install --cache-dir /tmp/c→ 强制覆盖,COMPOSER_CACHE_DIR被忽略 - 没设环境变量,也没传参数 → 才查
cache-dir配置项,再 fallback 到默认路径
CI 场景下推荐用环境变量而非 config 设置,因为更易注入、更难被项目级 composer.json 中的 "config": {"cache-dir": ...} 覆盖。Dockerfile 里加 ENV COMPOSER_CACHE_DIR /composer/cache 比 RUN composer config --global cache-dir /composer/cache 更稳。
为什么缓存 vendor/ 不如缓存 ~/.composer/cache?
缓存 vendor/ 目录看似省事,实则埋雷:
-
vendor/内容受 PHP 版本、扩展启用状态、platform配置、甚至post-install-cmd脚本执行结果影响 - 本地 PHP 8.2 + xdebug → CI PHP 8.1 无 xdebug → 缓存的
vendor/可能加载失败或跳过关键初始化 -
composer.lock哈希不变,不代表vendor/可跨环境复用
而 ~/.composer/cache 存的是原始包归档和元数据,不包含任何平台相关产物。只要 composer install 运行环境一致(PHP 版本、Composer 版本、lock 文件),它就能安全复用——这也是所有主流 CI 模板(GitHub Actions、GitLab CI)默认只缓存该路径的原因。
真正容易被忽略的一点是:缓存键必须包含 composer.lock 哈希、PHP 版本、Composer 版本三者。漏掉任一,都可能让旧缓存污染新构建。


















