Composer离线更新在虚拟机中必然失败,因其强依赖远程元数据解析且不支持COMPOSER_DISABLE_NETWORK=1;正确做法是在联网机生成新composer.lock,再于虚拟机执行COMPOSER_DISABLE_NETWORK=1 composer install --no-plugins --no-scripts --no-autoloader并补dump-autoload -o。

本地虚拟机里配 Composer 离线更新,核心不是“让它断网后还能连”,而是“让它根本不想联网”——必须提前切断所有网络触发点,否则 composer update 一跑就报 Could not fetch https://repo.packagist.org/packages.json。
为什么 composer update 在虚拟机里离线必挂
composer update 的设计就是强依赖远程元数据:它要重新解析 composer.json 里的所有包、比对最新版本、校验 dist URL 和哈希、甚至触发插件去查 GitHub tag。这些行为无法跳过,--no-network 参数根本不存在,COMPOSER_DISABLE_NETWORK=1 对它也无效(只影响 install 阶段的下载逻辑)。
- 即使你已设
repo.packagist false,update仍会尝试 fallback 到其他仓库或直接退出 - 若
composer.json含"repositories": [{"type":"packagist", "url": false}],update会直接报错并中止 - 任何带
dev-、dev-master或 Git URL 的依赖,在离线时无法校验 commit,必然失败
替代方案:用 composer require + path 仓库装新包
想在离线虚拟机里加一个新包,别碰 update,改用 require 配合本地 path 仓库。前提是该包代码已存在虚拟机本地路径,且结构合规(含 composer.json)。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
- 在虚拟机内建个目录,比如
/opt/local-packages/monolog,把目标包完整代码(含composer.json)放进去 - 执行
composer config --local repos.my-path type path - 再执行
composer config --local repos.my-path url /opt/local-packages/monolog - 最后运行
composer require monolog/monolog:dev-main(版本必须匹配其composer.json中的version或分支名) - 注意:
path仓库只支持顶层包,子依赖仍需提前解决(要么也放本地,要么用预构建的vendor/)
真正可行的离线“更新”流程:换 lock 文件 + 重装
所谓离线更新,本质是“换依赖关系描述 + 本地重装”。你不能让虚拟机自己算新依赖,但可以把它当纯执行器。
- 在联网机器上完成真实
composer update,生成新的composer.lock - 确保联网机 PHP 版本、扩展(
mbstring、openssl)、Composer 版本与虚拟机一致 - 把新
composer.lock拷进虚拟机,删掉旧vendor/ - 运行
COMPOSER_DISABLE_NETWORK=1 composer install --no-plugins --no-scripts --no-autoloader - 立刻补一记
composer dump-autoload -o,否则类加载大概率失效
最容易被忽略的陷阱:全局配置残留和缓存污染
虚拟机里常有历史安装留下的全局配置,它们会在你毫无察觉时偷偷联网。
- 运行
composer config --global --list,检查是否还有repo.packagist未被设为false - 执行
composer clear-cache,清空~/.composer/cache/下可能残留的过期元数据 - 确认
COMPOSER_HOME环境变量没指向一个不可写或权限混乱的路径,否则config --global写不进去 - 如果用了 Docker 虚拟机,记得在
Dockerfile中显式写入RUN composer config --global repo.packagist false,而不是只在 shell 里临时执行

















