COMPOSER_DISABLE_NETWORK=1是硬性前提,不设则composer install必联网请求packages.json失败;需配合--no-plugins --no-scripts --no-autoloader及dump-autoload -o,且必须清空全局和项目级packagist配置。

COMPOSER_DISABLE_NETWORK=1 是硬性前提,不设它必联网失败
Composer 没有“自动离线”模式,哪怕 vendor/ 目录完整、composer.lock 也没改过,composer install 仍会强制请求 https://repo.packagist.org/packages.json。这不是网络问题,是默认行为——它要校验包是否存在、版本是否合法、dist URL 是否可访问。唯一能彻底切断这个行为的,只有环境变量 COMPOSER_DISABLE_NETWORK=1。
常见错误现象:Could not fetch https://repo.packagist.org/packages.json,哪怕你已经把整个 vendor/ 拷过去了。
注意:--offline 参数根本不存在,是误传;--no-plugins、--no-scripts 等参数在没设该环境变量时完全无效。
离线安装框架核心包必须用 path 仓库 + @dev 标识
composer require 天然不支持离线:它默认要联网查包名、解析依赖树、校验版本约束。想在断网环境下加一个框架核心包(比如 cmzz/laravel-aliyun-sms),唯一可靠路径是把它当本地目录仓库用。
- 目标包根目录下必须有合法
composer.json,含完整name(如"cmzz/laravel-aliyun-sms")和明确version或分支标识(如"dev-main") - 项目
composer.json的repositories段要显式声明:{"type":"path","url":"./packages/laravel-aliyun-sms"} - 执行命令前必须设环境变量:
COMPOSER_DISABLE_NETWORK=1 - 运行:
composer require cmzz/laravel-aliyun-sms:@dev(注意必须带@dev,否则不识别 path 仓库)
全局和项目级 packagist 配置必须清空
即使写了 path 仓库,如果全局或项目配置里还残留 repo.packagist,Composer 仍会 fallback 到远程源并报错退出,不是静默忽略。
必须执行以下两步清理:
-
composer config --global repo.packagist false(清全局镜像) -
composer config repo.packagist输出应为空;如果显示composer https://packagist.org,说明项目级也残留,需手动删掉composer.json中的repositories里 type 为packagist的条目
特别注意:如果 composer.json 里写了 "repositories": [{"type": "packagist", "url": false}],在 COMPOSER_DISABLE_NETWORK=1 下会直接退出,而不是跳过。
dump-autoload -o 不是可选步骤,是运行时保命操作
即使 vendor/ 已存在、包也解压进去了,只要没执行 composer dump-autoload -o,PHP 运行时大概率报 Class not found。
原因很实在:PSR-4 自动加载规则不会被自动激活,尤其是 path 类型包,它的命名空间映射只在 autoload_psr4.php 里生成;而默认的 composer install 在 --no-autoloader 下会跳过这步。
所以离线流程中这一步不能省:
- 先跑:
COMPOSER_DISABLE_NETWORK=1 composer install --no-plugins --no-scripts --no-autoloader - 立刻补:
composer dump-autoload -o
别用 -a 或默认参数,-o 生成的是优化版静态映射,比动态散列更稳定,尤其在离线环境里容错更强。











