Composer代理与离线加速机制互斥,混用将导致排查失效;代理需同时配置http-proxy和https-proxy(后者必须以http://开头且密码URL编码),离线必须设置COMPOSER_DISABLE_NETWORK=1并清理镜像、避免git源锁文件。

Composer 代理配置和离线加速是两套完全不重叠的机制,混用会导致排查失效。代理用于弱网/企业防火墙环境,离线模式则要求彻底切断所有网络路径——设错一个开关,composer install 就会卡在 Loading composer repositories。
为什么 http-proxy 和 https-proxy 必须都配?
Composer 不读取系统级 HTTP_PROXY 环境变量,只认自己的配置项。漏掉 https-proxy 是最常见失败原因:Packagist、GitHub、GitLab 全走 HTTPS,没它等于没代理。
-
https-proxy的值必须以http://开头(哪怕代理监听 TLS 端口),填https://或无协议会静默 fallback 直连 - 密码含
@、/、:必须 URL 编码,例如pa@ss/word→pa%40ss%2Fword - 公司 NTLM 代理(如 Windows 域)原生不支持,得用
cntlm或px中转,让 Composer 连http://127.0.0.1:3128 - 验证是否生效:运行
composer config -g --list | grep -E "(http|https)-proxy",输出应为完整 URL 字符串
post-autoload-dump 是唯一可靠的代理验证钩子
代理配置错误时,composer install 会在元数据加载阶段卡住或超时,根本走不到 post-install-cmd;但只要 autoload 文件生成成功(哪怕只执行了 composer dump-autoload),post-autoload-dump 就一定触发。
- 适合放轻量验证逻辑,比如
"post-autoload-dump": "echo '✅ Autoloader rebuilt — network layer assumed ready'" - 不要用
post-package-install:它不是每个包装完就调一次,而是在整个流程结束后才调一次,且不带包上下文;官方已标注为experimental,随时可能移除 - 钩子不执行?先确认
vendor/autoload.php是否真生成出来——别和代理配置混在一起查
COMPOSER_DISABLE_NETWORK=1 是离线硬开关,不是可选项
不设这个环境变量,所有“离线参数”都无效。--no-network 参数根本不存在,Composer 官方从未实现,抄来只会被忽略。
- Linux/macOS:前置写法,
COMPOSER_DISABLE_NETWORK=1 composer install --no-plugins --no-scripts --no-autoloader - Windows CMD:
set COMPOSER_DISABLE_NETWORK=1 && composer install --no-plugins --no-scripts --no-autoloader - PowerShell:
$env:COMPOSER_DISABLE_NETWORK="1"; composer install --no-plugins --no-scripts --no-autoloader - 执行完必须立刻补一记
composer dump-autoload -o,否则运行时报Class not found
离线前最容易被忽略的三件事
很多团队在联网机上跑完 install,把 vendor 拷过去就以为能用,结果离线机上直接报错。问题往往出在这三点:
- 没清掉全局镜像配置:
composer config --global repo.packagist false必须执行,否则 Composer 会 fallback 尝试连接https://mirrors.aliyun.com/composer/ -
composer.lock里含"source": {"type": "git", ...}条目:这种锁文件天生不支持离线,install必然失败 - 用了
create-project初始化:它强制联网解析模板元数据,COMPOSER_DISABLE_NETWORK=1对它完全无效;离线必须改用分步法(git clone+ 复制vendor+dump-autoload)
离线不是“断网就行”,而是要切断所有触发网络的路径——包括配置残留、锁文件结构、命令选择。稍有遗漏,composer install 就会在 Loading co... 处停住,且不会报明确错误。


















