离线机必须显式配置cache-dir或composer_cache_dir,否则composer默认查找空的~/.composer/cache或%appdata%\composer\cache路径;需确保php进程用户有读执行权限,完整复制cache/files/目录树,校验zip路径结构,并配合--no-plugins --no-scripts --prefer-dist使用。

离线机上必须显式配置 cache-dir,否则 Composer 仍查空路径
离线机默认会去 ~/.composer/cache/(Linux/macOS)或 %APPDATA%\Composer\Cache\(Windows)找包,但这个路径在新机器上是空的。即使你把缓存文件复制过去了,Composer 不知道该查哪,就会跳过、报错或退回到联网行为。
正确做法是让 Composer 知道“缓存就在这个固定位置”,而不是依赖默认值:
- 用
composer config --global cache-dir /your/offline/cache/path永久写入全局配置 - 或设环境变量
COMPOSER_CACHE_DIR=/your/offline/cache/path(推荐,优先级更高,且不污染全局 config) - 确认路径权限:PHP 进程用户必须有读+执行权限(
ls -l能列出子目录,cat能读files/下任意 ZIP 文件)
cache/files/ 目录结构不能手动改,否则校验失败
Composer 缓存 ZIP 包的路径是 cache/files/vendor/name/version-hash/,文件名形如 vendor-name-package-name-zip-hash.zip。这个 version-hash 是由 composer.lock 中的 dist.shasum 和 URL 共同生成的,不是随意命名的。
常见错误是解压后重命名目录、移动 ZIP 到平铺路径、或用 rsync -a 但漏了隐藏文件(如 .gitignore 或空目录)。结果就是:composer install 找不到匹配项,报 Package not found —— 实际上包就在那儿,只是路径对不上。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 务必完整复制整个
cache/files/目录树,不要删空子目录 - Linux/macOS 上用
tar -C /dest -xzf cache.tgz;Windows 上用 7-Zip 解压并保留完整路径 - 验证方式:
find /your/cache/files -name "*.zip" | head -n 3,看路径是否含两级哈希目录
为什么 composer install --prefer-dist 仍报错?检查 openssl.cafile
即使缓存路径配对、ZIP 文件齐全,composer install 在离线机上仍可能卡在 SSL 验证环节,报错类似 cURL error 60: SSL certificate problem。这不是网络问题,而是 PHP 的 openssl.cafile 或 curl.cainfo 配置为空或指向不存在的证书路径。
Composer 在读取本地 packages.json(哪怕只是本地文件)时,仍会调用 cURL,并强制校验 TLS —— 即使 URL 是 file:// 或 http://localhost。
- 运行
php -i | grep -E "(openssl\.cafile|curl\.cainfo)"查当前值 - 若为空或路径无效,在
php.ini中补上:例如openssl.cafile=/etc/ssl/certs/ca-certificates.crt - 内网可信环境可临时绕过:
export COMPOSER_DISABLE_TLS=1(仅限离线、无中间人风险场景)
缓存路径配置生效后,仍需加 --no-plugins --no-scripts
配好 cache-dir 只解决“包在哪”,不解决“Composer 想干啥”。离线时插件(如 hirak/prestissimo)和脚本(如 post-install-cmd)仍可能触发网络请求或外部命令,导致失败。
所以最终命令必须是:
composer install --no-plugins --no-scripts --prefer-dist --no-interaction
-
--no-plugins:禁用所有插件,包括那些悄悄发 HTTP 请求的 -
--no-scripts:跳过任何 post-install 类脚本,避免执行npm install或写远程配置 - 缺一不可——只配缓存路径,不加这些参数,离线 install 依然大概率失败
composer clear-cache 会清掉你刚配好的那个目录。离线环境下别乱跑这个命令,除非你清楚它清的是哪个路径。










