composer require断网必报错或卡住,因默认强制联网查包名、校验版本、拉取依赖树;唯一离线方案是设COMPOSER_DISABLE_NETWORK=1并用path仓库类型,配合@dev标识和dump-autoload -o。

为什么composer require在断网时直接报错或卡住
因为composer require默认必须联网:它要查包名是否存在、校验版本约束、拉取依赖树、甚至 fallback 到 https://repo.packagist.org/packages.json。哪怕你本地磁盘上已有完整包目录,只要没设离线开关,Composer 就不会看一眼本地文件,而是执着地发 HTTP 请求——失败后要么报 Could not fetch https://repo.packagist.org/packages.json,要么无限等待超时。
必须用path仓库类型 + COMPOSER_DISABLE_NETWORK=1
这是唯一能绕过所有网络请求的组合。其他方式(比如手动复制 vendor、改 autoload)不被 Composer 认可,下次install或update会直接覆盖或报错。
- 本地包根目录下必须有合法
composer.json,含完整name(如"acme/utils")和明确version(如"1.2.0")或分支标识(如"dev-main") - 项目
composer.json的repositories字段里显式声明:[{"type":"path","url":"./packages/my-utils"}],url必须是相对路径,不能带file://或绝对路径 - 执行命令前务必设环境变量:
COMPOSER_DISABLE_NETWORK=1(Linux/macOS),Windows CMD 用set COMPOSER_DISABLE_NETWORK=1 && composer require ...,PowerShell 用$env:COMPOSER_DISABLE_NETWORK="1"; composer require ... - 安装时必须带
@dev后缀,例如composer require acme/utils:@dev;不加会因稳定性策略被过滤掉
composer install离线执行的最小安全命令
如果你只是想复原已有vendor/和未改动的composer.lock,别用require,直接走install流程——但它同样硬性依赖COMPOSER_DISABLE_NETWORK=1,否则必联网校验。
- 先确认全局配置没残留 Packagist:
composer config --global repo.packagist false,否则即使设了环境变量也会退出 - 运行:
COMPOSER_DISABLE_NETWORK=1 composer install --no-plugins --no-scripts --no-autoloader -
--no-plugins防插件初始化时隐式联网(如phpstan/extension-installer) -
--no-scripts防post-install-cmd调用外部 API -
--no-autoloader跳过 autoload 重建阶段(某些自定义加载器会触发远程请求) - 执行完立刻补一记:
composer dump-autoload -o,否则运行时大概率报Class not found
装完还提示类找不到?重点检查三处
不是包没装上,而是加载链路断了。90% 的问题出在这三个地方:
- 本地包的
composer.json里没写autoload段,或 PSR-4 命名空间与实际目录结构不匹配(例如声明了"MyCompany\Utils\": "src/",但文件实际在lib/下) - 没运行
composer dump-autoload -o,尤其当包用了 PSR-4 规则时,autoload.php 不会自动包含它 - 如果是 ThinkPHP 扩展,服务提供者(如
think\captcha\CaptchaService::class)没注册进config/app.php的providers数组,或composer.json里写了"dont-discover": ["*"]关掉了自动发现
vendor/目录里已存在该包,只要没执行dump-autoload -o,PHP 运行时就完全看不到它——Composer 不靠文件存在与否判断可加载性,只认 autoload 映射表。











