必须设COMPOSER_DISABLE_NETWORK=1,否则composer install必访https://repo.packagist.org/packages.json而卡住或报错;该变量是硬性开关,所有--no-xxx参数均依赖它生效,缺一则离线模式失效。

必须设 COMPOSER_DISABLE_NETWORK=1,否则 composer install 一定卡住或报 Could not fetch https://repo.packagist.org/packages.json —— 这不是网络不稳定,是 Composer 默认行为强制校验远程元数据。
为什么加了 --no-plugins --no-scripts 还失败
这些参数只跳过插件初始化和脚本执行,但无法阻止 Composer 在 install 阶段访问 Packagist 校验包是否存在、版本是否合法、dist URL 是否可访问。只要没设 COMPOSER_DISABLE_NETWORK=1,所有 --no-xxx 都无效。
-
COMPOSER_DISABLE_NETWORK=1是硬性开关,它让整个依赖解析流程跳过所有 HTTP 请求,包括仓库元数据加载、包信息查询、dist URL 检查 - 如果全局配置残留
repo.packagist(比如之前配过镜像),即使设了环境变量也会直接退出,必须先运行composer config --global repo.packagist false -
composer.json里写了"repositories": [{"type": "packagist", "url": false}],在COMPOSER_DISABLE_NETWORK=1下会立即报错退出,不是静默忽略
离线 install 的最小安全命令组合
前提是:目标机已存在完整 vendor/ 和未改动的 composer.lock,PHP 版本与扩展(mbstring、openssl、zlib)完全一致。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
-
--no-plugins:防止插件(如phpstan/extension-installer)在初始化时尝试联网 -
--no-scripts:屏蔽post-install-cmd,避免脚本调用外部 API 或生成前端资源 -
--no-autoloader:绕过 autoload 重建,某些自定义 autoloader 实现会触发远程类查找 - 执行完必须立刻补一记:
composer dump-autoload -o,否则运行时大概率报Class not found
vendor 目录能直接复制吗
可以,但有严格前提:
- 源机和目标机的 PHP 版本必须完全一致(比如都是
8.2.12;8.2.12vs8.2.13可能因内部 API 微变导致类加载失败) - 目标机必须已启用所有必需扩展,
vendor/autoload.php才能正常加载;缺mbstring或openssl会导致 require 失败 -
composer.lock必须一并拷贝且不能被修改,否则composer install会尝试重算依赖并触发联网 -
vendor/目录在目标机上必须可写,尤其vendor/composer/autoload_classmap.php,否则dump-autoload -o会失败
别碰 create-project 和 update
composer create-project 在离线机上必挂——它第一件事就是访问 https://repo.packagist.org/packages.json 解析模板元信息,COMPOSER_DISABLE_NETWORK=1 对它无效,--offline 参数根本不存在。
- 替代方案是:在联网机上
git clone或解压骨架,跑完composer install --no-dev --prefer-dist --no-scripts --no-plugins --optimize-autoloader,再整体打包迁移 -
composer update必须禁用,它会强制连packagist.org,离线环境没有合法替代路径 - 如果
composer.lock中某个包是"source"类型(如 Git URL 或"dev-master"),离线时无法校验,install必然失败
最容易被忽略的是:即使 vendor/ 和 composer.lock 都完整,只要没设 COMPOSER_DISABLE_NETWORK=1,或者残留了任何 repo.packagist 配置,composer install 就不会真正进入离线模式——它会在某个你没预料到的环节突然卡住或报错,而不是给出明确提示。

















