COMPOSER_DISABLE_NETWORK=1是私有包离线安装的硬性前提,不设置则composer install必请求https://repo.packagist.org/packages.json而失败;需配合--no-plugins、--no-scripts、--no-autoloader及--prefer-dist生成的composer.lock使用。

私有包离线安装必须显式禁用网络,COMPOSER_DISABLE_NETWORK=1 是硬性前提
不是“断网就自动离线”,只要没设这个环境变量,composer install 仍会尝试请求 https://repo.packagist.org/packages.json,直接报错。即使 vendor/ 已存在、composer.lock 完整,也拦不住它去校验远程元数据。这个行为无法跳过,只能靠 COMPOSER_DISABLE_NETWORK=1 强制关闭。
常见错误现象:Could not fetch https://repo.packagist.org/packages.json 或 Failed to connect to repo.packagist.org port 443,哪怕你确认物理断网了也照样出。
-
COMPOSER_DISABLE_NETWORK=1必须在执行前设置,export 或前置命令都行,例如:COMPOSER_DISABLE_NETWORK=1 composer install --no-plugins --no-scripts --no-autoloader - 如果项目
composer.json里写了"repositories": [{"type": "packagist", "url": false}],即使设了COMPOSER_DISABLE_NETWORK=1,也会直接退出,不是忽略 - 全局配置残留的
repo.packagist会触发 fallback 校验,必须运行composer config --global repo.packagist false彻底清掉
私有源必须在项目级 composer.json 中声明 repositories 数组
很多人以为改私有包自己的 composer.json 就够了,其实完全无效。Composer 只读取你当前要安装依赖的那个项目的顶层 composer.json 中的 repositories 字段——不写在这里,composer require 一定失败,且不会提示原因,只会安静报 Could not find package。
使用场景:你有一个 GitLab 上的私有组件 mycorp/utils,想在离线项目中复用它已打包好的 ZIP 或 dist 文件。
-
repositories必须是 JSON 数组,不能是对象;每项必须含"type"(只接受"vcs"、"composer"或"path")和合法"url" - 若走
"type": "composer",url应指向你内网 Satis 镜像的packages.json地址(如http://internal-mirror/packages.json),不能带.git后缀 - 多个源按数组顺序匹配,第一个命中即停;同名包后面的会被忽略,所以私有源建议放前面
离线时 "source" 类型包必然失败,必须转为 "dist"
composer.lock 里若某个包标记为 "source"(比如 "dev-master"、Git commit hash 或直接写 Git URL),离线时无法校验 commit 是否存在、无法拉代码,composer install 必然中断。这不是配置问题,是机制限制。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
解决办法只有一个:提前在联网环境把这类包固化为 "dist" 类型。方法是运行 composer update --prefer-dist(或 composer install --prefer-dist),确保 composer.lock 中对应条目变成 "dist": {"url": "...", "shasum": "..."} 结构。
- 检查方式:打开
composer.lock,搜"source",凡出现该字段的包,在离线环境下都不安全 -
--prefer-dist不是可选优化,是离线部署的必要条件;否则即使你本地有完整 Git 仓库,Composer 也不会用 - CI 构建阶段就要做这步,生成的
composer.lock才能用于离线环境
离线执行 composer install 的最小安全命令组合
这组参数不是“锦上添花”,而是防止意外联网的强制防护。前提是:vendor/ 目录为空(或已清理)、composer.lock 未改动、PHP 版本和必需扩展(mbstring、openssl、zlib)完全一致。
-
--no-plugins:跳过插件初始化,避免phpstan/extension-installer等隐式联网 -
--no-scripts:屏蔽post-install-cmd,防止脚本调用外部 API 或生成配置 -
--no-autoloader:绕过 autoload 重建,某些自定义实现会触发远程类查找
执行完必须立刻补一记:composer dump-autoload -o,否则运行时大概率报 Class not found。这个步骤不可省,也不能合并到 install 命令里——因为 --no-autoloader 就是让它跳过。
最易被忽略的一点:Satis 镜像输出目录必须通过 Web 服务(如 Nginx)提供 HTTP 访问,不能直接用 file:// 协议;否则即使设了 repositories,Composer 也会因协议不支持而静默失败。

















