COMPOSER_DISABLE_NETWORK=1是离线安装的硬性开关,不设则所有参数无效;必须前置设置该环境变量,配合--no-plugins --no-scripts --no-autoloader执行install,并立即运行dump-autoload -o。

COMPOSER_DISABLE_NETWORK=1 是离线安装的硬开关,不设它一切参数都无效
Composer 不会因为断网就自动切到“离线模式”。它默认坚持请求 https://repo.packagist.org/packages.json,哪怕 vendor/ 和 composer.lock 都完整存在。错误不是文件缺失,而是元数据校验环节强制联网——这个行为无法跳过,除非你显式切断触发路径。
必须在执行前设置环境变量:COMPOSER_DISABLE_NETWORK=1。在 Dockerfile 中写 ENV COMPOSER_DISABLE_NETWORK=1,在 shell 中用前缀运行:COMPOSER_DISABLE_NETWORK=1 composer install。别信 --offline,它根本不存在。
常见误操作:
- 只断网不设变量 → 仍报
Could not fetch packages.json - 设了变量但全局配置残留
repo.packagist→ fallback 校验失败退出 - 项目
composer.json里写了"repositories": [{"type": "packagist", "url": false}]→COMPOSER_DISABLE_NETWORK=1下直接终止,不静默忽略
vendor 目录能复制,但得过三关:PHP 版本、扩展、lock 文件
直接拷 vendor/ 是最快方式,但前提是源与目标环境完全一致。任何偏差都会导致运行时报 Class not found 或 autoload 失败。
必须验证以下三点:
-
php -v输出版本号(含小版本)完全一致,例如8.3.12vs8.3.12;8.3.12vs8.3.13可能因内部 API 微变失效 - 目标机已启用
mbstring、openssl、zlib扩展(缺一个,vendor/autoload.php就加载失败) -
composer.lock必须未被修改,且不含"source"类型条目(如"url": "git@github.com:xxx/yyy.git"或"dev-master")
验证方式:php -r "require 'vendor/autoload.php';" 不报错才算通过。
install 命令必须带 --no-plugins --no-scripts --no-autoloader
即使 vendor/ 已存在,composer install 默认仍可能触发插件初始化或脚本执行,从而隐式联网。必须显式禁用这些环节:
-
--no-plugins:跳过hirak/prestissimo等加速插件,它们会在无网络时卡住或报错 -
--no-scripts:屏蔽post-install-cmd,防止调用npm install、生成前端资源或访问外部 API -
--no-autoloader:绕过 autoload 重建阶段,某些自定义 autoloader 实现会尝试远程类查找(虽少见但真实存在)
执行完这步后,**必须立刻补一记**:composer dump-autoload -o。否则运行时大概率报 Class not found——因为 autoload 映射没更新,或旧路径残留干扰。
新增依赖只能靠 path 仓库,不能用 require
离线环境下,composer require 一定会失败。它默认要联网查包名、解析依赖树、校验版本约束,**不读本地缓存,也不检查 ~/.composer/cache/files/**。
唯一可靠方式是把本地目录当仓库用:
- 目标包根目录下必须有合法
composer.json,含完整name(如"acme/utils")和明确version或分支标识(如"dev-main") - 项目
composer.json的repositories段添加:{"type":"path","url":"./packages/my-utils"} - 执行
COMPOSER_DISABLE_NETWORK=1 composer require acme/utils:@dev(注意必须带@dev或@dev-main) - 装完立即执行
composer dump-autoload -o,否则 PSR-4 自动加载规则不会生效
最容易被忽略的是:path 包解压进 vendor/ 后,autoload 并不会自动包含它——这步必须手动触发,且 -o 参数不可省。











