断网机运行Composer项目需三步:拷贝composer.phar并配置PHP环境;设COMPOSER_DISABLE_NETWORK=1禁联网并清空packagist仓库;执行composer dump-autoload -o生成优化autoload映射。

断网电脑上不能“安装 Composer”本身,只能部署已下载好的 composer.phar 并配置好本地 PHP 环境;真正要解决的,是“如何让这个断网机跑起基于 Composer 的 PHP 项目”,核心在于跳过所有联网行为、绕过元数据校验、确保 autoload 可用。
怎么把 composer.phar 放到断网机上并能执行
Composer 不是传统意义的“安装程序”,它本质就是一个 PHP 脚本(composer.phar)。断网机不需要联网下载,只需手动拷贝:
- 从有网机器或官网(https://getcomposer.org/download/)下载对应平台的
composer.phar(注意选带 PHP 版本兼容性的版本,如 PHP 8.2) - 确认断网机已装好 PHP,且
php -v输出正常、扩展(mbstring、openssl、zlib)齐全 - 把
composer.phar放到一个路径清晰的位置,比如./bin/composer.phar - 为方便使用,加个 alias 或批处理:Linux/macOS 下在
~/.bashrc加alias composer='php /path/to/composer.phar';Windows CMD 可写composer.bat,内容为@php "%~dp0composer.phar" %*
为什么 composer install 还会报 Could not fetch packages.json
因为默认行为就是联网——哪怕 vendor/ 已存在、composer.lock 完整,Composer 仍会尝试请求 https://repo.packagist.org/packages.json 做元数据校验。这不是 bug,是设计如此。
- 必须提前设环境变量:
COMPOSER_DISABLE_NETWORK=1,否则所有--no-xxx参数都无效 - 检查是否真禁用了 Packagist:运行
composer config -g repos.packagist,应返回 “Key does not exist”;若输出composer https://packagist.org,说明全局镜像没清干净 - 项目级
composer.json中若还有"repositories"块含"packagist": false或类似写法,得删掉整个repositories段,否则COMPOSER_DISABLE_NETWORK=1下会直接退出
离线跑通 vendor/autoload.php 的关键三步
很多人拷了 vendor/ 目录就以为完事了,结果 Class not found。autoload 不是自动生效的,尤其当包用了 PSR-4 或含自定义加载逻辑时。
- 先确保
vendor/和composer.lock是从同一次成功composer install --prefer-dist生成的,且未被手动修改 - 在断网机上执行:
COMPOSER_DISABLE_NETWORK=1 composer dump-autoload -o(-o不可省,它生成优化版映射,比默认散列方式更稳定) - 验证:写个测试脚本
require 'vendor/autoload.php'; var_dump(class_exists('Monolog\Logger'));,返回true才算真正就绪
想在断网机上加新包?别用 require,改用 path 仓库
composer require 在离线环境下必然失败,它不查缓存、不读本地目录、不做任何 fallback,就是硬连网络。唯一可行的是把本地目录当仓库用。
- 目标包根目录下必须有合法
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,否则不识别 path 包) - 立刻补一记:
composer dump-autoload -o,否则新增类不会进 autoload 映射
最易被忽略的点:COMPOSER_DISABLE_NETWORK=1 必须出现在每一条命令前,不是设一次就全局生效;dump-autoload -o 也不是可选项,它是让 class 自动加载真正可用的最后一环;path 仓库里的包若含 "options": {"symlink": false},是为了防止断网机软链失效——这些细节漏掉一个,项目就起不来。











