最稳方式是设composer_cache_dir环境变量,优先级最高;确认真实路径应执行composer global show -v查cache directory行,而非仅看config --global输出。

缓存目录没设对,Composer 就不会真正复用包,只会反复下载——这不是慢,是白干。
怎么确认当前 Composer 正在用哪个缓存目录
别信 composer config --global cache-dir 的输出,它只显示配置值,不反映真实路径。真正生效的是运行时解析后的结果:
- 执行
composer global show -v,找Cache directory:那一行,这才是实际读写的路径 - 或者跑一次
composer install(哪怕项目已装好),立刻检查目标目录下是否新增了archived/或repo/子目录 - 如果用了
COMPOSER_CACHE_DIR却没生效,大概率是之前用composer config --global cache-dir设过值,得先运行composer config --global --unset cache-dir
改缓存目录最稳的方式是设 COMPOSER_CACHE_DIR 环境变量
这个变量优先级最高,能强制覆盖所有其他配置,特别适合 CI/CD 和多用户机器:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- Linux/macOS:在
~/.zshrc里加export COMPOSER_CACHE_DIR="/mnt/ssd/composer-cache",然后source ~/.zshrc - Windows PowerShell:
$env:COMPOSER_CACHE_DIR="D:\composer-cache";CMD 则用set COMPOSER_CACHE_DIR=D:\composer-cache - Docker 中必须显式注入:
ENV COMPOSER_CACHE_DIR=/cache(Dockerfile)或docker run -e COMPOSER_CACHE_DIR=/cache -v $(pwd)/cache:/cache - 路径里不能带英文双引号,
COMPOSER_CACHE_DIR="/path/with space"是错的——要么避免空格,要么用符号链接绕过
composer config --global cache-dir 改了但不生效?常见原因
这条命令只是写进 ~/.composer/config.json,不是“立即接管”,很多情况会失效:
- 目录不存在,或当前用户没有读写权限(Linux/macOS 下还缺
x权限,进不去目录) - 路径挂载在 NFS、Docker volume 或受限磁盘上,内核拒绝写入(错误藏在 verbose 日志里:
file_put_contents(): failed to open stream: Permission denied) - 用 root 跑过一次
composer global require,旧缓存目录属主是 root,切回普通用户就写不进去 - CI 环境中设了
COMPOSER_CACHE_DIR却没挂载持久卷,每次构建都是空目录,等于白设
离线场景下,只配 cache-dir 没用,得用 cache-files-dir
默认缓存目录里的 files/ 子目录才是离线安装时真正被读取的 ZIP 包位置。想打包带走供内网使用,必须单独配置它:
- 联网机上先运行
composer config --global cache-files-dir /path/to/offline-cache - 再执行
composer install --no-autoloader --no-scripts --prefer-dist,确保所有包落进该目录 - 检查是否生成了类似
monolog/monolog/2.10.0.0/monolog-monolog-6a8c4b5.zip的结构 - 内网机上同样设
cache-files-dir,并确保COMPOSER_DISABLE_NETWORK=1(否则 Composer 还是会尝试连远程)
缓存路径本身不解决网络瓶颈,也不自动迁移旧数据;设错之后 Composer 往往静默退化成无缓存模式,你根本收不到报错——只能靠 global show -v 和目录内容来交叉验证。










