断网时不能安装Composer,只能将预编译的composer.phar拷贝至目标机;离线安装依赖需设COMPOSER_DISABLE_NETWORK=1,配合完整vendor/和未改动composer.lock,并执行composer dump-autoload -o生成优化类映射。

断网时不能“安装”Composer,只能把预编译好的 composer.phar 拷过去直接用;所谓“离线安装依赖”,本质是绕过所有网络校验,靠提前打包的 vendor/ 和 composer.lock 配合硬性环境开关来驱动。
怎么把 Composer 本体弄进断网机器?
Composer 不是系统包,没有离线安装器。你必须在有网、同 PHP 版本的机器上生成可执行文件,再拷贝过去:
- 运行
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" - 用官网当前提供的 SHA384 哈希值校验:
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→ 生成composer.phar - 拷到目标机,加执行权限:
chmod +x composer.phar,建议软链到/usr/local/bin/composer
别用 apt install composer 或 Windows Installer —— 它们版本滞后、不保证兼容你的 PHP,且仍可能在运行时尝试联网。
vendor 目录已存在,为什么 composer install 还报 Could not fetch packages.json?
因为 Composer 默认行为就是联网校验元数据,哪怕 vendor/ 和 composer.lock 都完整,它也会坚持请求 https://repo.packagist.org/packages.json。这不是 bug,是设计逻辑。
- 必须前置设置环境变量:
COMPOSER_DISABLE_NETWORK=1(Dockerfile 写ENV COMPOSER_DISABLE_NETWORK=1,Shell 前缀加该变量) -
--offline参数不存在,是常见误传,别用 - 全局配置残留会 fallback:运行
composer config --global repo.packagist false彻底禁用 Packagist - 检查
composer.lock是否含"source": {"type": "git"}条目 —— 离线时无法解析,必须全为dist类型
离线安装新包(比如本地开发的 utils 库)怎么搞?
composer require 在断网下必然失败,它根本不会查缓存或本地路径。唯一可行路径是把目录当仓库用,走 path 类型:
- 目标包根目录必须有合法
composer.json,含"name": "acme/utils"和明确"version": "1.0.0"或"dev-main" - 项目
composer.json的repositories段加:{"type":"path","url":"./packages/my-utils"} - 执行
composer require acme/utils:@dev(注意必须带@dev,^1.0这类约束不生效) - 立刻运行
composer dump-autoload -o,否则class_exists()一定返回false - 推荐加
"options": {"symlink": false}到 path 仓库定义里,避免软链在容器或跨平台时失效
为什么 dump-autoload -o 是离线最后一步,且不能省?
因为 vendor/autoload.php 不是静态文件,它由 Composer 动态生成。即使 vendor/ 已解压、类文件都在,没跑 dump-autoload -o,PSR-4 映射就不会写入优化版 vendor/composer/autoload_classmap.php,运行时几乎必报 Class not found。
-
-o(optimize)强制生成 classmap,比默认的散列映射更稳定,尤其在只读文件系统或容器中 - 如果项目用了
classmap-authoritative模式,这步更是硬性要求 - 别信“vendor 里有 autoload.php 就能用”——那是安装时生成的草稿,不是最终加载入口
最易被忽略的是 PHP 环境一致性:宿主机生成的 vendor/ 若在容器里用,必须确保 PHP 小版本、扩展(mbstring、openssl、zlib)、甚至 OS 内核 ABI 完全一致,否则 autoload.php 加载阶段就直接 fatal error。











