离线时 composer 报“could not fetch”是因为默认强制联网校验 packages.json,即使 vendor 和 lock 文件完整;必须设置 composer_disable_network=1 才能进入离线路径,否则所有参数如 --no-plugins 均无效。

离线时 Composer 为什么还会报 Could not fetch
因为默认行为是强制联网校验 packages.json,哪怕 vendor/ 已存在、composer.lock 完整,它仍会尝试请求 https://repo.packagist.org/packages.json。这不是缓存失效,而是设计如此——不设断网开关,它根本不会进离线路径。
必须提前设置环境变量:COMPOSER_DISABLE_NETWORK=1。没这句,--no-plugins、--no-scripts 全无效,命令直接卡在元数据拉取阶段。
验证是否真断网:往 /etc/hosts 加一行 127.0.0.1 packagist.org,再跑 composer install -v;看到 Connection refused 才算到位。
离线可用的镜像到底要包含什么
不是随便拷个 vendor/ 或缓存里的 .zip 就行。真正支撑 composer require 或 update 的,只有两样东西:
-
packages.json(含所有依赖的元数据,包括间接依赖如psr/log) - 合规命名的 dist 包:
vendor-name-package-name-version.zip(短横线分隔,不能是monolog-2.10.0.zip这种简写)
这两者必须匹配:zip 文件里的 dist.shasum 要和 packages.json 里记录的一致,否则 COMPOSER_DISABLE_NETWORK=1 下会直接退出,不是静默跳过。
用 Satis 构建私有镜像时,"archive": {"format": "zip"} 和 "require-all": true(或精确列出包名)是关键配置;输出目录必须能被 file:// 或内网 HTTP 访问。
怎么让项目读到本地镜像
别碰全局配置——~/.composer/config.json 在离线机上根本不可靠。唯一可控的是项目级 composer.json 的 repositories 字段:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
正确写法(注意顺序和结构):
{"repositories": [{"packagist.org": false}, {"type": "composer", "url": "file:///path/to/offline-mirror"}]}
要点:
-
{"packagist.org": false}必须放在第一位,否则 Composer 仍会 fallback 到官方源 -
url用file://协议时,路径必须绝对且可读;用 HTTP 时,确保 Web 服务已启动且返回Content-Type: application/json - 改完立刻删掉
vendor/和composer.lock,再跑composer install --no-plugins --no-scripts --no-autoloader
cache-files-dir 是离线场景唯一该配的路径
其他缓存路径(如 repo/、archived/)断网即失效。只有 files/ 子目录下的 zip 包能在离线时被 --prefer-dist 直接读取。
操作步骤:
- 先清旧配置:
composer config --global --unset cache-dir(避免冲突) - 设专用路径:
composer config --global cache-files-dir /mnt/offline-cache - 在线机执行:
composer install --prefer-dist --no-autoloader --no-scripts - 检查目标路径下是否有类似
monolog/monolog/2.10.0.0/monolog-monolog-6a8c4b5.zip的结构
这个路径可以打包带走,但注意:PHP 进程用户(如 www-data)必须对它有读写权限,否则日志里静默失败,无任何提示。
最易被忽略的是 PHP CLI 环境本身——宝塔等面板常禁用 proc_open 或 putenv,导致 Composer 启动失败,根本走不到镜像环节。先修环境,再谈配置。










