内网用composer离线安装的核心是彻底禁用对repo.packagist.org的http请求:必须执行composer config -g repo.packagist false或指向内网源,配合hosts屏蔽与composer_disable_network=1实测验证,否则仍非真离线。

内网用 Composer 离线安装,核心不是“怎么装”,而是“怎么让 composer install 根本不发任何 HTTP 请求”——只要它还试图访问 repo.packagist.org,就不是真离线。
确认 repo.packagist 是否已全局禁用
很多团队配了内网镜像却仍失败,是因为没关掉默认源。Composer 2.2+ 会硬编码访问 repo.packagist.org 获取元数据,除非显式覆盖:
- 执行
composer config -g repo.packagist,若输出是{"type": "composer", "url": "https://repo.packagist.org"}或直接报错,说明没生效 - 必须运行:
composer config -g repo.packagist false(彻底禁用)或composer config -g repo.packagist composer https://packagist.internal(指向内网) - 别只改项目级配置:
composer config repo.packagist对 CI/CD 和新项目无效,-g 是强制项 - 验证是否成功:运行
composer config -g -l | grep repo,输出里应只有你设的 URL 或false
用 Satis 构建静态镜像时必须启用 archive
Satis 生成的只是 JSON 文件列表,没有 ZIP 包,composer install 仍会尝试下载——因为 lock 文件里的 dist.url 指向的是远程地址。必须让 Satis 把包也一并打包进来:
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
- 在
satis.json中确保有"archive"段,且"format": "zip"已启用 - 加
"require-all": false,配合"require"显式列出项目用到的包(避免同步全量 100GB+) - 构建命令要带
--no-interaction和--skip-errors,否则私有包缺失会导致中断 - 生成后检查
web/dist/目录下是否有 ZIP 文件,再确认packages.json里对应包的dist.url是相对路径(如dist/monolog-monolog-2.9.1.zip)
离线机上必须用 HTTP 服务托管镜像,不能用 file://
Composer 2+ 明确禁用 file:// 协议作为仓库源,哪怕路径完全正确,也会报 Invalid repository type: file:
- 把 Satis 生成的
web/目录放到 Nginx/Apache 下,确保能通过http://192.168.10.100/packages.json访问到内容 - 关键检查点:用
curl -I http://192.168.10.100/packages.json看响应头是否含Content-Type: application/json;Nginx 默认可能返回application/octet-stream,需手动配置 MIME 类型 - 配置命令必须是:
composer config -g repos.packagist '{"type":"composer","url":"http://192.168.10.100"}'(注意双引号转义) - 别漏掉
repos.前缀——写成repos.my-mirror就不会覆盖默认源
实测是否真正离线:hosts + COMPOSER_DISABLE_NETWORK=1
配置完别急着跑 install,先验证是否真的断网。靠日志判断容易误判,因为 “Resolving dependencies” 那行之后还有几十次 provider 请求:
- 临时加
127.0.0.1 repo.packagist.org到/etc/hosts(Windows 同理) - 设置环境变量:
COMPOSER_DISABLE_NETWORK=1(Linux/macOS)或set COMPOSER_DISABLE_NETWORK=1(Windows) - 运行
composer install -v,看到Connection refused或Failed to connect才算成功;如果还出现Downloading https://repo.packagist.org/...,说明某处配置漏了 - 这个组合是兜底手段:
COMPOSER_DISABLE_NETWORK=1会让所有插件、脚本、fallback 机制全部失效,暴露真实依赖路径问题
最容易被忽略的点:Satis 构建时没加 --skip-dev,导致镜像里混入 dev 分支 ZIP,而离线机 PHP 版本或扩展不满足,install 会静默跳过该包,最后报 “Package not found”——但错误信息根本不会提 dev 分支的事。










