composer update 缓存权限被拒是因 ~/.composer/cache/ 目录属主为 root,需用 sudo chown -r $user:$user $(composer config --global cache-dir) 修复;composer_cache_dir 必须为绝对路径、提前创建且可写;composer.json 中 cache-dir 无效;clear-cache 不清元数据,需手动删 repo/https---packagist.org/。

composer update 时缓存目录权限被拒绝怎么办
直接看报错里 file_put_contents 后面那个路径——大概率是 ~/.composer/cache/ 或其子目录属主为 root,而当前用户无权写入。这不是“权限不够”,是“东西不归你管”。
用这三行快速定位:
ls -ld $(composer config --global cache-dir)ls -ld ~/.composer/cache/repo/https---packagist.orgls -ld ~/.composer/cache/files
只要任意一行第三列(属主)不是 $USER,比如显示 root root,就确认是所有权错配。
修复方式只有一条路:
– 全局缓存目录: sudo chown -R $USER:$USER $(composer config --global cache-dir)
– 别碰 chmod -R 777,它会让 vendor/ 下的 PHP 文件、autoload 映射、bin 脚本全局可写,属于安全风险
COMPOSER_CACHE_DIR 环境变量设了但没生效?
环境变量优先级最高,但它不是配置项,而是运行时覆盖,极易静默失效。
必须满足三个条件才真正起作用:
– 路径必须是绝对路径:export COMPOSER_CACHE_DIR="/tmp/composer-cache",不能带 ~
– 目录必须提前创建且可写:mkdir -p /tmp/composer-cache && chown $USER:$USER /tmp/composer-cache
– Docker 场景下尤其注意:如果挂载宿主机目录(如 -v /host/cache:/tmp/composer-cache),但该目录属主是普通用户,而容器以 root 启动,就会因 UID 不匹配写失败,Composer 静默 fallback 到默认路径
验证是否真生效,别信 echo $COMPOSER_CACHE_DIR:
运行 composer diag,盯住 Cache directory: 这一行输出;再 ls -lh 它显示的路径,确认有新文件生成
为什么改了 composer.json 的 cache-dir 没用
composer.json 里的 "config": {"cache-dir": "/xxx"} 字段对缓存路径完全无效。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
这个字段只被 composer config 命令读取,install、update 等核心命令压根不看它。
真正决定缓存路径的顺序只有三条:
– COMPOSER_CACHE_DIR 环境变量(最高)
– 全局 cache-dir 配置(通过 composer config --global cache-dir /path 设置)
– 默认路径(~/.composer/cache)
手动改 ~/.composer/config.json 或写环境变量字符串,90% 会因 JSON 格式错误(逗号漏写、引号未闭合)、路径含 ~ 而静默跳过整个配置——composer diag 看起来正常,实际行为已异常
缓存清理后 update 还拉不到新版?元数据卡住了
composer clear-cache 不清理仓库元数据,只会清 files/ 和部分临时文件。所以 composer update 可能仍读旧的 packages.json 快照,显示 “nothing to install or update”。
必须手动删掉元数据缓存目录:rm -rf ~/.composer/cache/repo/https---packagist.org/
顺手也清掉本地状态快照,避免冲突:rm -f vendor/composer/installed.json composer.lock
验证是否重拉元数据:composer update --dry-run -v | grep "Downloading.*packages.json" —— 看到这一行才算真正生效
复杂点在于:元数据缓存和文件缓存是分离的,cache-files-ttl 和 cache-read-only 都不影响元数据刷新逻辑;而 repo/ 目录结构是硬编码拼接的,路径里 https--- 中的三个短横是真实目录名,不能手误写成两个或四个










