离线环境无法执行 composer update,因其必须联网解析依赖并下载包;唯一可行的是在联网机生成新 lock 和 vendor 后搬运,或通过 COMPOSER_DISABLE_NETWORK=1 配合 --repository-url=file:// 本地仓库方式运行 composer install。

离线环境根本不能执行 composer update
这个命令默认会联网访问 packagist.org 或配置的仓库,解析 composer.json、重新计算依赖树、下载新版本元数据和 dist 包。专网无公网时,它会卡在 Could not fetch packages 或直接报 cURL error 7,连本地 composer.lock 都不会读——它压根不走离线路径。
真正能用的只有 composer install,但它只认 composer.lock,不会“更新”任何东西。所谓“离线更新”,本质是在有网机器上生成新 lock + 新 vendor,再搬运过去。
- 想升级某个包?必须先在联网机改
composer.json,跑composer update vendor/package,生成新composer.lock和完整vendor/ - 想升 PHP 版本?先改
config.platform.php,再删旧composer.lock,再composer update—— 这步必须联网 - CI 构建流程里,
composer install是部署动作,composer update是构建动作,两者不可混用
--repository-url=file:// 是唯一可控的离线安装方式
单纯复制 vendor/ 目录到专网机器,composer install 仍可能触发网络请求:比如某些包的 post-install-cmd 脚本调用 curl,或插件(如 hirak/prestissimo)尝试预热缓存。更稳的方式是让 Composer 把本地文件夹当仓库用。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
- 在联网机执行
composer install --no-dev --prefer-dist,确保所有包走 zip 下载(不是 git clone) - 拷贝
~/.composer/cache/files/下全部.zip文件(按vendor/name/commit-hash.zip结构)到专网机某路径,例如/mnt/composer-dist/ - 专网机运行:
COMPOSER_DISABLE_NETWORK=1 composer install --no-dev --prefer-dist --repository-url=file:///mnt/composer-dist/ - 该命令强制跳过所有网络请求,并按
composer.lock中记录的 exact commit 和 sha256 校验每个 zip 是否匹配
专网机器上执行 composer install 前必须检查三件事
报错不是因为没网,而是环境不一致。常见失败点和对应检查项:
-
PHP version:确认专网机 PHP 版本 ≥composer.lock中所有包声明的require.php最低版本(比如锁文件里某包 require php >=8.2,而机器是 8.1,就会失败) -
ext-zip:解压 dist zip 必需,缺失会导致Failed to extract错误;ext-json、ext-openssl同样不可少 -
权限与 SELinux:CentOS 专网环境常开 SELinux,vendor/解压后文件可能被标记为unconfined_u:object_r:user_home_t:s0,导致 autoload 失败;用restorecon -Rv vendor/重置上下文
私有包(GitLab / SVN)在离线环境怎么处理
如果 composer.json 里用了 "type": "vcs" 或私有仓库地址,--repository-url=file:// 不会生效——Composer 仍会尝试 clone。正确做法是提前把私有包源码 clone 到专网机本地,再改用 path 类型仓库。
- 在专网机创建目录,如
/opt/private-packages/my-lib,放入已 clone 的代码(含完整composer.json) - 项目根目录的
composer.json中添加:"repositories": [{"type": "path", "url": "/opt/private-packages/my-lib"}] - 确保该路径下
composer.json的name字段与项目中require的名字完全一致(包括大小写) - 运行
COMPOSER_DISABLE_NETWORK=1 composer install即可从本地路径加载,不再触发 git 操作
composer install 静默跳过某些包,最终运行时报 Class not found。

















