必须设置COMPOSER_DISABLE_NETWORK=1,否则composer install会强制请求远程元数据而失败;需配合--no-plugins、--no-scripts、--no-autoloader及后续dump-autoload -o执行。

离线安装前必须设 COMPOSER_DISABLE_NETWORK=1
不设这个环境变量,composer install 会无视所有 --no-xxx 参数,坚持去请求 https://repo.packagist.org/packages.json,报错后直接退出。它不是“建议开启”,而是硬性开关——没它,一切离线操作都无效。
常见错误现象:Could not fetch https://repo.packagist.org/packages.json,哪怕 vendor 目录完整、lock 文件也存在。
- 在 Dockerfile 中写:
ENV COMPOSER_DISABLE_NETWORK=1 - 在 shell 中运行前加前缀:
COMPOSER_DISABLE_NETWORK=1 composer install ... - 别用
--offline:该参数不存在,是常见误传
vendor 目录能直接复制,但得过三关
极简场景下最省事的方式就是把整个 vendor/ 连同 composer.lock 一起拷过去,但必须确认这三点是否全部满足:
- 源与目标的 PHP 版本完全一致(如
8.3.12vs8.3.12,小版本不同也可能因内部 API 变更导致Class not found) - 目标机已启用
mbstring、openssl、zlib扩展(缺一个,autoload.php就加载失败) -
composer.lock未被修改,且不含"source"类型条目(比如"url": "git@github.com:xxx/yyy.git"或"dev-master")
验证方式:在目标机执行 php -r "require 'vendor/autoload.php';",不报错才算通过。
install 命令必须带这组参数才真正离线
即使 vendor/ 已存在,也得再跑一次 composer install 来校验一致性并重建 autoload;但默认行为仍可能触发插件或脚本。必须显式禁用:
-
--no-plugins:防止hirak/prestissimo等插件尝试联网加速 -
--no-scripts:跳过post-install-cmd(比如自动执行npm install或生成前端资源) -
--no-autoloader:先绕过 autoload 重建,避免因路径残留出错 - 最后补一记:
composer dump-autoload -o(否则运行时大概率Class not found)
完整命令示例:COMPOSER_DISABLE_NETWORK=1 composer install --no-plugins --no-scripts --no-autoloader && composer dump-autoload -o
别碰 create-project,它天生不支持离线
composer create-project 在设计上就强制联网:第一步解析模板元数据(访问 packages.json),第二步才 clone 和 install。它不读本地 vendor/,不认 COMPOSER_DISABLE_NETWORK=1,也没有 --offline 选项。
替代做法只有两个字:分步。
- 在联网机用
git clone或解压 ZIP 拿到骨架 - 执行
composer install --no-dev --prefer-dist --no-plugins --no-scripts --optimize-autoloader - 打包整个目录(含
vendor/、composer.lock、composer.json)传入离线机
最容易被忽略的是:离线机上执行前,先清掉全局缓存路径干扰——composer config --global cache-dir /dev/null,否则某些插件仍可能从旧缓存里捞东西。











