composer update 在离线环境下根本不可行,它必须联网获取 packages.json、解析版本、校验哈希并重写 composer.lock;真正可行的是在有网环境完成 update 后,将 vendor/、composer.lock、composer.json 及 ~/.composer/cache/files/ 同步至离线机,再执行 COMPOSER_DISABLE_NETWORK=1 composer install --no-plugins --no-scripts。

composer update 在国内网络环境下离线执行根本不可行——它必须联网拉取 packages.json、解析版本约束、校验哈希、重写 composer.lock。所谓“离线更新”,实际是把联网动作提前做完,再把结果搬进内网。真要落地,只有两条路:要么彻底断网、靠完整 vendor/ + 环境隔离;要么搭本地镜像、让 Composer 认为“外网就在本机”。
为什么 composer update 一运行就报错?
典型错误如:Could not fetch https://repo.packagist.org/packages.json 或 Failed to decode response,不是配置问题,是 Composer 2.x 默认行为:只要没显式切断网络通路,update 就会硬连 Packagist。哪怕你删了全局 repo、改了镜像源、加了 --no-plugins,也拦不住初始元数据请求。
COMPOSER_DISABLE_NETWORK=1 下 composer update 仍失败?
设了环境变量后,composer update 会直接退出并报错:Package not found 或 dist.url is invalid。因为 update 阶段需要动态查版本范围、比对 composer.json 和当前 lock 文件差异,这些逻辑依赖远程元数据。没有 packages.json,它连“有哪些版本可选”都不知道,根本走不到下载环节。
-
composer install可离线——它只读composer.lock,不查新版本 -
composer update不可离线——它必须重建依赖图,绕不开仓库元数据 - 强行加
--ignore-platform-reqs或--no-interaction不解决本质问题
真正能落地的“伪离线更新”怎么做?
前提是在有网机器(建议用和目标环境一致的 PHP 版本、Composer 版本)上完成全部联网动作,再把产物同步过去:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 在联网机执行:
composer update --prefer-dist --no-dev --no-interaction,确保composer.lock和vendor/全量生成 - 同步整个
vendor/目录 +composer.lock+composer.json - 若需保留
composer install流程(比如要触发 autoload 重生成),则额外同步~/.composer/cache/files/目录,并在离线机执行:COMPOSER_DISABLE_NETWORK=1 composer install --no-plugins --no-scripts --no-autoloader - 最后必须补:
composer dump-autoload -o,否则运行时报Class not found
想在离线机上新增或替换单个包怎么办?
别碰 composer update vendor/name,它照样要联网。可行路径只有两个:
-
用
path仓库直引本地源码:把修改好的包放本地目录(如./packages/my-fork),在composer.json里加:{"repositories": [{"type": "path", "url": "./packages/my-fork"}], "require": {"vendor/name": "dev-main"}},然后跑composer require vendor/name:dev-main --no-update && composer install --no-plugins --no-scripts -
手动换包 + 锁版本:删掉
vendor/vendor/name,用composer require vendor/name:1.2.3 --no-update改composer.json,再执行composer install --no-plugins --no-scripts——前提是1.2.3版本已在缓存中存在(路径如~/.composer/cache/files/vendor/name/xxx.zip)
最常被忽略的是:离线机上 composer.lock 的 content-hash 和 platform 字段必须与当前 PHP 环境匹配,否则 install 会拒绝执行,连提示都未必清晰。

















