composer config --global cache-files-dir 控制归档文件实际写入位置,必须显式配置为绝对路径且以/files结尾(如/data/composer-cache/files),手动创建目录并确保读写权限;仅设cache-dir无效,因它只定缓存根目录,不指定归档子路径。

composer config --global cache-files-dir 控制归档文件实际写入位置
Composer 下载的 .zip、.tar.gz 原始包(即“导出路径”所指)不由 cache-dir 决定,必须显式配置 cache-files-dir。这个路径是 Composer 真正把压缩包落地的唯一位置,配错或漏配会导致反复下载、缓存命中率为 0。
-
cache-files-dir必须设为绝对路径,例如/data/composer-cache/files;不能用~或环境变量 - 该目录需手动创建,且当前运行用户有读写权限:
mkdir -p /data/composer-cache/files && chmod 755 /data/composer-cache/files - 配置命令必须带
--global:composer config --global cache-files-dir "/data/composer-cache/files" - 改完立刻执行
composer clear-cache,再跑一次composer install -vvv,搜日志中Writing into cache行确认路径是否匹配
为什么只改 cache-dir 没用?
cache-dir 只控制缓存根目录(比如 ~/.composer/cache),而归档文件默认存在其子目录 files/ 下。你设了 cache-dir,archived/ 和 files/ 会自动建在它下面,但无法单独指定 files/ 的位置——除非你显式覆盖 cache-files-dir。
- 常见失效现象:
composer config -g cache-files-dir输出为空、CI 构建中磁盘占用高但无归档文件生成 - Docker 或 CI 中,若未透传
COMPOSER_CACHE_DIR环境变量,进程可能读不到全局配置 - Windows 下路径含空格或中文,Composer 会静默 fallback 到默认路径,不报错也不提示
验证归档路径是否真正生效
别只看 composer config 输出,要确认运行时行为:
- 执行
composer config -g cache-files-dir,必须返回非空绝对路径 - 检查环境变量:
php -r "echo getenv('COMPOSER_CACHE_DIR');"(尤其 Docker 容器内) - 安装后直接进该路径,看是否有哈希命名的
.zip文件生成,例如2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2c3d4e5f6a7b8c9d0e1f2a3.zip - 如果没生成,大概率是权限问题或路径被环境变量覆盖
导出路径和 vendor 目录完全无关
有人误以为改 config.vendor-dir 或 bin-dir 能影响归档路径,其实完全无关。vendor 是解压后的代码存放地,cache-files-dir 是压缩包原始文件的落盘地,两者生命周期不同、存储格式不同、配置项也彼此独立。
-
vendor-dir改的是依赖解压后的位置,不影响下载阶段的 zip 存哪 -
bin-dir只管可执行文件链接位置,跟归档路径零关系 - 真正容易被忽略的点:
cache-files-dir必须精确指向files/这一层,不是它的父目录;写成/data/composer-cache就会失效











