Composer全局安装离线必然失败,因其global require强制联网获取Packagist元数据(包名、版本、dist URL、checksum),且COMPOSER_DISABLE_NETWORK=1对其无效;唯一可行方案是在线机打包~/.composer/vendor并手动部署到离线机,再配置PATH与执行composer global dump-autoload。

断网环境下无法用 composer global require 直接安装全局组件——它默认必须联网查包、校验版本、拉取元数据,哪怕你本地有缓存或已下载 ZIP,只要没显式切断网络通路,就会报 Could not fetch https://repo.packagist.org/packages.json。
为什么 composer global require 在离线时必然失败
全局安装本质是往 ~/.composer/vendor(Linux/macOS)或 %APPDATA%\Composer\vendor(Windows)里写文件,但整个流程依赖 Packagist 元数据:包名解析、版本约束求解、dist URL 生成、checksum 校验。这些步骤全部需要访问远程仓库,且无法跳过。即使你把 ZIP 包拷进 ~/.composer/cache/files/,global require 也不会读它。
-
COMPOSER_DISABLE_NETWORK=1对global require无效——这个环境变量只影响install和update,不控制global子命令 - 全局命令没有
--no-plugins或--no-autoloader这类开关,所有参数都会被忽略 - 试图在离线机上运行
composer global require phpunit/phpunit,结果一定是卡住或报连接超时
离线装全局组件的唯一可行路径:手动部署 + PATH 注入
核心思路是绕过 Composer 的解析逻辑,直接把可执行文件放到位,并确保系统能识别。前提是:你有一台在线机,能提前准备好完整包结构。
- 在线机上运行:
composer global require --no-scripts --no-plugins phpunit/phpunit(加参数减少副作用) - 打包整个全局 vendor 目录:
tar -czf composer-global-vendor.tgz ~/.composer/vendor(Linux/macOS)或用 7-Zip 压缩%APPDATA%\Composer\vendor(Windows) - 把压缩包拷到离线机,解压覆盖目标路径(确认路径一致:
~/.composer/vendor或%APPDATA%\Composer\vendor) - 检查
~/.composer/vendor/bin/(或对应 Windows 路径)下是否存在phpunit文件(软链接或脚本) - 把该
bin目录加进$PATH(Linux/macOS 编辑~/.zshrc;Windows 在“环境变量”中添加)
验证和补救:autoload 不生效?不是 Composer 的问题
全局组件的自动加载(如 phpunit 内部类)不走项目级 vendor/autoload.php,而是靠 Composer 自己维护的全局 autoloader。离线部署后若报 Class not found,通常是因为:
- 全局
vendor解压不完整,缺了composer/autoload_classmap.php或autoload_psr4.php - PHP 版本不一致,导致某些
require_once失败(比如用了 PHP 8.2 的语法,离线机只有 8.0) - 没运行过
composer global dump-autoload—— 这步必须在离线机上手动执行,它会重建全局 autoload 映射
注意:composer global dump-autoload 不联网,但它依赖 ~/.composer/composer.json 和当前 vendor 结构,所以部署前别动这个文件。
更轻量的替代方案:不走全局,改用项目内 path 仓库
如果只是临时用某个工具(比如 laravel/installer),没必要强求全局。可以在目标项目里用 path 类型仓库,把工具源码目录当本地包引入:
- 把
laravel/installer源码(含composer.json)放到项目下./tools/laravel-installer - 修改项目根目录
composer.json,加:"repositories": [{"type": "path", "url": "./tools/laravel-installer"}] - 运行:
COMPOSER_DISABLE_NETWORK=1 composer require laravel/installer:dev-main - 再跑一次:
composer dump-autoload -o
这样生成的 vendor/bin/laravel 就在当前项目可用,完全不依赖全局状态,也避开所有网络校验点。


















