多用户共享缓存目录必须用composer_cache_dir环境变量;--global cache-dir仅写当前用户配置,其他用户不可见;路径须为绝对路径(如/srv/composer-cache),提前创建并设组权限,禁用777;验证以composer diag输出为准。

多用户共享缓存目录必须用 COMPOSER_CACHE_DIR 环境变量
直接改 composer config --global cache-dir 对多用户无效——它只写当前用户的 ~/.composer/config.json,其他用户根本读不到。真正能跨用户生效的,只有环境变量 COMPOSER_CACHE_DIR,且它优先级最高,启动即覆盖所有配置。
常见错误是把路径设成 ~/composer-cache 或 $HOME/composer-cache,这在多用户环境下会静默退回到默认路径(比如 ~/.cache/composer),不报错也不提示。
- 路径必须是绝对路径,例如
/srv/composer-cache,不能含波浪号、变量或相对符号 - 目录必须提前创建:
sudo mkdir -p /srv/composer-cache - 确保所有目标用户对该目录有读写权限,推荐用组权限而非 777:
sudo chgrp -R composer-group /srv/composer-cache && sudo chmod -R g+rwX /srv/composer-cache - 每个用户需在 shell 配置中设置:
export COMPOSER_CACHE_DIR=/srv/composer-cache,然后重启终端或重新登录
为什么不能直接 chmod -R 777 /srv/composer-cache
777 会让 Composer 缓存文件带上 world-writable 权限,CI 工具(如 GitHub Actions runner)会拒绝上传带该权限的 artifact;Git 也会频繁提示 ownership changed;更严重的是,多个用户并发写入同一 repo/ 目录时,可能因文件锁缺失导致 JSON 元数据损坏,表现为 packages.json: failed to open stream 或 Invalid data encountered。
正确做法是建专用用户组(如 composer-group),把所有需要共享缓存的用户加进去:sudo usermod -a -G composer-group alice && sudo usermod -a -G composer-group bob,再统一设组可写。
验证是否真被所有用户共用一个缓存
不要只信 composer config --global cache-dir 的输出——它显示的是“全局配置值”,不是“实际生效路径”。真正起作用的是运行时解析出的缓存位置。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 每个用户分别执行:
composer diag | grep "Cache directory" - 确认所有输出都指向同一个绝对路径,比如都显示
Cache directory: /srv/composer-cache - 检查缓存内容是否实际复用:让用户 A 执行
composer require monolog/monolog,再让用户 B 在新项目里composer install,观察是否跳过下载并直接解压/srv/composer-cache/files/monolog/monolog/下的 zip
如果 B 仍从网络下载,说明要么环境变量没生效,要么目录权限没对齐——尤其注意 ls -ld /srv/composer-cache 的组名和用户所属组是否一致。
CI/CD 和 Docker 中的坑:环境变量必须进进程环境
Dockerfile 里写 RUN export COMPOSER_CACHE_DIR=/tmp/cache 是无效的,因为 RUN 是独立 shell,变量不会传给后续指令。必须用 ENV 指令:
ENV COMPOSER_CACHE_DIR=/tmp/composer-cache
GitHub Actions 中,env: 必须放在 job 级别,不能只写在某个 step 里;GitLab CI 则需确保 variables: 在 before_script 之前生效。
最容易被忽略的一点:Web 服务器(如 nginx + php-fpm)和 CLI 用户不同,但它们共用同一个 COMPOSER_CACHE_DIR 变量时,若 PHP 进程未继承该环境变量(比如 php-fpm 配置里没设 env[COMPOSER_CACHE_DIR]),就会悄悄回退到各自家目录下的默认缓存,造成“看似共享,实则各写各的”。










