离线使用Composer必须在联网机生成无网络依赖的可执行文件(非composer.phar),拷贝至U盘后在离线机设COMPOSER_DISABLE_NETWORK=1并运行composer install --no-plugins --no-scripts --no-autoloader,再执行dump-autoload -o。

U盘拷贝前必须在联网机生成可执行 composer 文件
直接把 composer.phar 拷进 U 盘不保险——它默认带签名校验逻辑,离线运行时仍会尝试连 https://getcomposer.org 验证更新。真离线要用官方安装脚本生成「无网络依赖」的可执行文件。
在联网且 PHP 环境一致的机器上执行:
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('sha384', 'composer-setup.php') === 'e0012edf3e80b6978849f5eff0d4b4e4c79ff1609dd1f6a331a8365dfe33b4d8d826ad669113f128fd004e28787949af298b') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); }"
php composer-setup.php --install-dir=/tmp --filename=composer
chmod +x /tmp/composer
然后把 /tmp/composer(注意:不是 composer.phar)拷到 U 盘根目录。这个文件是纯 PHP 脚本封装的可执行二进制,不含任何远程校验逻辑。
U盘插进离线机后要验证权限和路径
很多失败卡在权限或路径问题,不是 Composer 本身出错:
-
chmod +x必须在离线机上再执行一次——U 盘 FAT32/exFAT 格式不保留 Linux 权限位 - 别直接
./composer --version运行,先cp /mnt/usb/composer /usr/local/bin/再chmod +x /usr/local/bin/composer - 确认 PHP 已安装且在
$PATH中:php --version和which php都得有输出 - 运行
composer --version成功 ≠ 可用;断网后跑composer diagnose,看到Checking HTTP connectivity: FAIL才算过关
离线机上装项目依赖不能直接 run install
即使 U 盘里带着完整的 vendor/ 和 composer.lock,直接 composer install 仍会报 Could not fetch https://repo.packagist.org/packages.json——因为默认行为强制联网校验元数据。
必须显式切断网络通路并绕过高风险环节:
- 先设环境变量:
export COMPOSER_DISABLE_NETWORK=1 - 删掉已有
vendor/(残留旧 autoload 易冲突) - 执行:
COMPOSER_DISABLE_NETWORK=1 composer install --no-plugins --no-scripts --no-autoloader - 立刻补一记:
composer dump-autoload -o,否则运行时必报Class not found
如果项目含 path 类型本地包,composer.json 中必须已声明 "repositories": [{"type":"path","url":"./packages/my-utils"}],且提前运行过 composer config --global repo.packagist false。
常见卡点:为什么 composer install 还是连上了外网?
不是 U 盘拷错了,而是配置残留或路径没对齐:
- 检查全局配置:
composer config --global repo.packagist输出应为空,不是https://packagist.org - 检查项目级配置:
composer config repo.packagist同样必须为空 -
composer.lock里不能有"source": {"type": "git", "url": "git@github.com..."}这类条目——离线无法 clone - 目标机 PHP 版本必须和生成
vendor/的机器完全一致(包括小版本),否则autoload_classmap.php生成逻辑可能失效
最省事的验证方式:拔网线 + echo '127.0.0.1 repo.packagist.org' >> /etc/hosts,再跑 install —— 如果还报 Connection refused,说明网络真正被切死了;如果报其他错误,才是环境或配置问题。


















