composer config cache-dir 输出当前生效的缓存根目录,受环境变量、项目配置和全局配置影响,优先级为环境变量 > 项目配置 > 全局配置;默认路径因系统而异,空输出表示使用默认路径。

composer config cache-dir 查看当前缓存路径
Composer 默认把包下载后解压的归档、安装的 vendor 包源码、压缩包等都存在本地缓存里,不是每次 composer install 都重下——但很多人不知道它藏哪。直接运行命令就能看到:
-
composer config cache-dir输出的就是当前生效的缓存根目录(比如/home/username/.composer/cache或C:\Users\Name\AppData\Roaming\Composer\Cache) - 这个值受
COMPOSER_CACHE_DIR环境变量、composer.json里的config.cache-dir、全局配置三者影响,优先级:环境变量 > 项目配置 > 全局配置 - 如果输出为空,说明没显式配置过,走默认路径;Windows 和 Linux/macOS 默认路径不同,别硬猜
cache-dir 被覆盖时怎么定位真实位置
有时候 composer config cache-dir 显示一个路径,但实际包却下到别处,常见于 CI 环境或自定义脚本中设置了环境变量。验证真实路径最可靠的方式是触发一次下载再观察:
- 删掉当前缓存(
composer clear-cache),然后运行composer require monolog/monolog:2.10.0 --no-install(加--no-install只下载不装) - 立刻去
cache-dir下的repo/和files/子目录翻,repo/存着 packagist.org 的元数据 JSON,files/存着 zip 包和解压后 hash 命名的文件夹 - 如果找不到,用
strace -e trace=openat,open composer require ... 2>&1 | grep cache(Linux)或Process Monitor(Windows)抓系统调用,看它到底 open 了哪个路径
vendor 目录 ≠ 缓存目录,别混淆
新手常把 vendor/ 当成缓存,其实它是「安装产物」,而缓存是「下载+预处理中间态」。两者的生命周期和用途完全不同:
-
vendor/是项目运行时依赖,由composer install从缓存或远程复制/解压而来;删掉vendor/不影响缓存,再install会秒装 - 缓存目录里没有
autoload.php,也没有项目 require 的具体版本符号链接,只有原始 zip、tar、JSON 和 hash 命名的 unpacked 文件夹 - 改
cache-dir不影响已有vendor/,但新require会走新路径;反之,清空缓存不会动vendor/,除非你加了--no-cache
CI/CD 中 cache-dir 设置不当导致重复下载
在 GitHub Actions、GitLab CI 里,如果只缓存 vendor/ 却忽略 cache-dir,每次 job 都要重下 zip 包——尤其国内网络下,几十秒变几分钟:
- GitHub Actions 推荐同时缓存
~/.composer/cache(Linux/macOS)或%USERPROFILE%\AppData\Roaming\Composer\Cache(Windows),用actions/cache@v4按路径缓存 - GitLab CI 注意:默认
composer config --global cache-dir写的是 root 用户路径,runner 用非 root 用户跑时得显式设环境变量COMPOSER_CACHE_DIR - 缓存命中率看
composer install -v日志里有没有Downloading ... (cached),没这句就是没走缓存










