断网时直接运行composer install必然失败,必须设COMPOSER_DISABLE_NETWORK=1环境变量并配合--no-plugins --no-scripts --no-autoloader参数,再执行composer dump-autoload -o;vendor可复制但需PHP版本、扩展、lock文件全一致。

断网时直接运行 composer install 必然失败,不是“加个参数就能跑”,而是必须提前切断所有网络触发点、校验环境一致性、并绕过默认的元数据校验流程。
COMPOSER_DISABLE_NETWORK=1 是硬性开关,不是可选项
不设这个环境变量,composer install 会坚持请求 https://repo.packagist.org/packages.json,哪怕 vendor/ 已存在、composer.lock 完整、甚至你写了 "repositories": [{"type": "packagist", "url": false}] —— 它会直接报错退出,而不是静默忽略。
- Linux/macOS:前置写法,
COMPOSER_DISABLE_NETWORK=1 composer install - Windows CMD:
set COMPOSER_DISABLE_NETWORK=1 && composer install - PowerShell:
$env:COMPOSER_DISABLE_NETWORK="1"; composer install - 容器中建议在
Dockerfile写ENV COMPOSER_DISABLE_NETWORK=1,避免每次命令都拼接
离线 install 必须带 --no-plugins --no-scripts --no-autoloader
只设环境变量还不够。默认行为仍会加载插件、执行脚本、重建 autoload,而这些环节可能间接触发网络调用(比如 phpstan/extension-installer 初始化时查版本,或 symfony/flex 拉 recipe)。
-
--no-plugins:禁用所有插件,包括加速下载类插件(如hirak/prestissimo) -
--no-scripts:跳过post-install-cmd,防止脚本调用npm install或 curl 外部资源 -
--no-autoloader:绕过 autoload 重建阶段,某些自定义 autoloader 实现会尝试远程类查找(虽少见但真实存在)
执行完这步后,必须立刻补一记:composer dump-autoload -o。否则运行时大概率报 Class not found —— 因为 autoload 映射没刷新,且未启用优化模式(-o 强制生成 classmap,更稳定)。
vendor 目录能直接复制,但三件事必须全满足
很多人以为把 vendor/ 拷过去就完事了,结果离线机上 require 'vendor/autoload.php' 直接 fatal error。问题往往卡在这三点:
- PHP 版本必须完全一致(例如
8.3.12vs8.3.12,小版本不同也可能因内部 API 变更导致Class not found) - 目标机已启用必需扩展:
mbstring、openssl、zlib(缺一个,autoload.php就加载失败) -
composer.lock不能含"source": {"type": "git"}类条目(如"url": "git@github.com:xxx/yyy.git"或"dev-main"),这类锁文件天生不支持离线
验证方式很简单:在目标机执行 php -r "require 'vendor/autoload.php';",不报错才算通过。
离线添加新包只能走 path 仓库,require 命令无效
composer require 默认必须联网解析依赖树、校验版本约束、下载新包——它不查本地缓存,也不认 ~/.composer/cache/files/ 中的 ZIP 文件。断网时执行它只会立刻报 Could not fetch 或卡住。
- 唯一可行路径:把本地包目录当仓库用,类型必须是
path - 目标包根目录下必须有合法
composer.json,含完整name(如"acme/utils")和明确version或分支标识(如"dev-main") - 项目
composer.json的repositories段显式声明:{"type":"path","url":"./packages/my-utils"} - 执行
composer require acme/utils:@dev(注意必须带@dev,否则不识别)
装完必须立即运行 composer dump-autoload -o,否则即使文件在 vendor/ 里,class_exists() 也会返回 false —— 因为 PSR-4 映射没更新,且软链("options": {"symlink": false})在离线机上容易失效。
最容易被忽略的是全局配置残留:如果之前配过镜像源,composer config --global repo.packagist false 这一步不做,离线时 Composer 仍会 fallback 尝试连接 https://mirrors.aliyun.com/composer/;还有人误信 --offline 参数,其实它根本不存在,官方从未实现。


















