离线环境必须配置cache-files-dir而非cache-dir,因为只有files/子目录下的zip包支持离线复用;cache-dir仅为混合缓存父目录,不控制zip存储位置,未配cache-files-dir时composer回退到默认路径且离线机该路径通常为空。

离线环境必须用 cache-files-dir,不是 cache-dir;只配后者,断网时照样重下。
为什么 cache-dir 配了也白配?
Composer 的缓存目录是混合结构:repo/ 存元数据(断网失效)、archived/ 存解压后归档(不参与离线复用)、只有 files/ 下的 ZIP 包能被 --prefer-dist 直接读取并校验。而 cache-dir 只是父路径,它不控制 ZIP 存哪——真正决定离线是否可行的是 cache-files-dir,且它必须显式指向含 /files 后缀的绝对路径。
-
cache-dir设成/tmp/composer-cache→files/实际还在/tmp/composer-cache/files,但 Composer 不保证写入 -
cache-files-dir没设 → Composer 回退到默认~/.composer/cache/files,离线机上该路径很可能为空 - 配了
cache-dir但没清旧配置 →cache-files-dir被忽略,因 Composer 会优先沿用旧逻辑
离线前必须做的三件事
在线机执行以下操作,缺一不可:
- 先清掉干扰项:
composer config --global --unset cache-dir - 设唯一有效路径:
composer config --global cache-files-dir /path/to/offline-cache/files(注意末尾/files) - 触发完整下载:
composer install --no-autoloader --no-scripts --prefer-dist(确保所有子依赖 ZIP 都落进/files)
验证是否真写进去了:检查 /path/to/offline-cache/files/monolog/monolog/2.10.0.0/monolog-monolog-6a8c4b5.zip 这类路径是否存在。不存在,说明下载没走缓存路径。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
离线机上怎么让 Composer 找到这些 ZIP?
目标机不能只拷 ZIP 文件,还得告诉 Composer 去哪读:
- 把整个
/path/to/offline-cache/files目录复制过去(保留层级结构) - 在离线机运行:
composer config --global cache-files-dir /your/copied/path/files - 确认生效:
composer diag输出中Cache files directory行必须和你设的一致
常见失败点:cache-files-dir 指向的是父目录(如 /cache),但实际要的是 /cache/files;或者目录权限不对,PHP 进程用户(如 www-data)无法 stat() 该路径下的文件,结果静默 fallback 到重下。
为什么 cache-read-only 不能单独用?
设 cache-read-only true 只是跳过写,但它仍要读 files/ 下的 ZIP。如果挂载为只读(如 Docker :ro)、目录属主不是当前用户、或 /files 下为空,Composer 就不会尝试匹配,直接放弃缓存。
- 必须同时满足:
cache-read-only true+cache-files-dir显式指向已有 ZIP 的/files路径 + 该路径可读(非:ro挂载) - 验证关键指标:
composer diag中Cache hit rate> 0,否则说明 ZIP 没被识别或校验失败
最容易被忽略的其实是 files/ 目录的完整性——少一个子依赖的 ZIP(比如 psr/log),整个 composer install 就会卡在“Package not found”,而不是报错提示缺哪个包。










