离线安装 Composer 本体需在联网且 PHP 环境一致的机器上执行官方安装脚本、校验 SHA384 哈希、生成 composer.phar,再拷贝至目标机并设执行权限及系统软链;验证需 composer --version 成功且 openssl 模块启用。

断网环境下 Composer 本身无法在线安装,必须提前在有网机器上生成 composer.phar 并拷贝过去;项目依赖也不能用 composer require,唯一可靠路径是预打包 vendor/ + composer.lock,或用 path 类型仓库挂本地包。
怎么离线安装 Composer 本体?
别信“断网自动降级”——curl | php 或 apt install composer 在断网时必然失败。必须在联网且 PHP 环境一致的机器上操作:
- 执行官方安装脚本,但要校验哈希:
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"→ 用当前官网提供的sha384值校验(不是固定值,每次更新)→php composer-setup.php→php -r "unlink('composer-setup.php');" - 生成的
composer.phar直接拷到目标机,加执行权限:chmod +x composer.phar - 建议软链进系统路径:
sudo ln -s /path/to/composer.phar /usr/local/bin/composer - 验证:
composer --version能输出版本号,且php -m | grep openssl显示已启用(缺openssl会导致后续所有 HTTPS 下载失败)
已有 vendor 目录,为什么 composer install 还报 Could not fetch packages.json?
因为 Composer 默认行为是:即使 vendor/ 和 composer.lock 都完整,它仍会主动请求 https://repo.packagist.org/packages.json 校验元数据。这不是 bug,是设计逻辑——它不信任本地文件,除非你明确掐断网络通路。
- 硬性前置:
COMPOSER_DISABLE_NETWORK=1必须设,否则所有--no-xxx参数都无效 - 全局 Packagist 必须禁用:
composer config --global repo.packagist false,否则 fallback 仍触发 - 检查项目配置:
composer config repo.packagist输出应为空,不能是composer https://packagist.org - 推荐命令组合:
COMPOSER_DISABLE_NETWORK=1 composer install --no-plugins --no-scripts --no-autoloader
如何离线添加一个新包(比如本地开发的 utils 库)?
composer require vendor/name 在断网时直接卡死或报错,它根本不会查缓存,也不支持本地路径直引。唯一可行方式是把目录当仓库用,靠 path 类型跳过所有远程请求。
- 目标包根目录下必须有合法
composer.json,含"name"(如"acme/utils")和"version"(如"dev-main")或分支标识 - 项目
composer.json的repositories段显式声明:{"type":"path","url":"./packages/my-utils"}(路径建议相对、可移植) - 执行:
COMPOSER_DISABLE_NETWORK=1 composer require acme/utils:@dev(必须带@dev,^1.0这类约束不生效) - 装完立刻运行:
composer dump-autoload -o,否则autoload.php不包含该包,运行时报Class not found - 注意:
"options": {"symlink": false}要加在包的composer.json里,避免离线机软链失效
为什么 dump-autoload -o 是强制步骤,不能省?
因为 path 包或预打包的 vendor/ 里,PSR-4 自动加载规则不会被默认识别——Composer 的 autoload 机制在 install 或 require 后并不会自动扫描新目录,尤其当包用了命名空间映射时。
-
composer dump-autoload重建vendor/autoload.php中的类映射表 -
-o参数生成优化版(classmap),比默认的散列文件更稳定,且不依赖运行时文件扫描 - 漏掉这步,哪怕文件物理存在、
composer install显示成功,运行时仍大概率Fatal error: Class 'X\Y\Z' not found - 验证是否生效:
php -r "require 'vendor/autoload.php'; var_dump(class_exists('Acme\Utils\Helper'));"输出bool(true)











