默认情况下composer install读全局缓存目录,因Composer未隔离用户上下文,多用户共用~/.composer/cache等路径导致权限冲突和缓存污染;解决方案是用最高优先级环境变量COMPOSER_CACHE_DIR强制隔离各用户缓存路径,并同步配置cache-vcs-dir及确保权限与挂载点有效。

为什么 composer install 会读全局缓存目录
默认情况下,composer install 不管你在哪个用户下运行,只要没显式指定缓存路径,就会往 ~/.composer/cache(Linux/macOS)或 %LOCALAPPDATA%\Composer\cache(Windows)里读写。这个目录是共享的,一旦某个用户用 sudo composer global require,整个 cache/ 归属变成 root:root 或 Administrators,其他用户执行 composer install 就直接卡在 Permission denied —— 连 composer clear-cache 都进不去。
用 COMPOSER_CACHE_DIR 环境变量强制隔离
别碰 composer config --global cache-dir,它优先级低、易被覆盖、且多用户下写一次就全局生效。真正起作用的是环境变量 COMPOSER_CACHE_DIR,它是 Composer 启动时最高优先级的缓存路径控制项。
- Linux/macOS:在
~/.zshrc或~/.bashrc里加一行export COMPOSER_CACHE_DIR="/home/$USER/.composer-cache",然后source ~/.zshrc - Windows PowerShell:在
$PROFILE里加$env:COMPOSER_CACHE_DIR="$HOME\composer-cache" - Docker 中必须显式注入:
docker run -e COMPOSER_CACHE_DIR=/cache -v $(pwd)/cache-$(whoami):/cache ... - 路径里不能含空格或英文双引号;若必须带空格,用符号链接绕过,比如
ln -s "/mnt/big disk/composer-cache" ~/composer-cache
配完后,每个用户启动的 composer install 都只读写自己目录,互不干扰。验证方式:切换用户,运行 composer global show -v | grep "Cache directory",确认路径指向各自家目录。
cache-vcs-dir 必须单独配,否则 Git 包每次重 clone
cache-vcs-dir 和 cache-dir 完全无关,但不配它,所有 Git 类型包(比如 "type": "git" 的私有仓库)每次 composer install 都会重新 clone,哪怕缓存路径已隔离。必须同步设:
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
- Linux/macOS:
composer config --global cache-vcs-dir "$COMPOSER_CACHE_DIR/vcs" - Windows:
composer config --global cache-vcs-dir "%COMPOSER_CACHE_DIR%\vcs"
注意:这个命令得在每个用户环境下分别执行,不能只配一次。因为 cache-vcs-dir 是独立配置项,不会随 COMPOSER_CACHE_DIR 自动推导。
权限和挂载点容易被忽略的硬坑
即使设了独立路径,若该路径挂载在 NFS 或 Docker volume 上,内核可能静默拒绝写入,错误只藏在 -vvv 日志里,表现为 “Could not write to cache” 却无明确报错。另外,composer config --global cache-dir 输出不可信——它只显示配置值,不反映实际路径;真实路径得看 composer global show -v 里的 Cache directory: 行。










