内网使用Composer需构建本地离线镜像源:先用Satis在联网机生成静态包仓库,再同步至内网服务器,最后配置Composer指向该源;支持私有包dist方式引入及增量更新。

在内网环境使用 Composer,核心是把所有依赖包和元数据提前下载好,构建一个本地可访问的离线镜像源。不需要外网,但需要一台能联网的机器做前期准备,再把资源同步到内网服务器或开发机。
一、用 Packagist 镜像站生成离线包(推荐 Satis)
Satis 是官方推荐的轻量级静态包仓库生成工具,适合内网部署。它不依赖数据库,只生成 JSON 和 ZIP 文件,Nginx/Apache 直接托管即可。
- 在有网机器上安装 Satis:
composer create-project composer/satis --stability=stable - 编写
satis.json,明确指定要镜像的包和版本(避免全量同步,节省空间):{ "name": "internal/packagist", "homepage": "http://packages.internal", "repositories": [ { "type": "composer", "url": "https://packagist.org" } ], "require-all": false, "require": { "monolog/monolog": "^2.0", "guzzlehttp/guzzle": "^7.0" }, "archive": { "directory": "dist", "format": "zip", "skip-dev": true } } - 运行
php bin/satis build satis.json web/,生成完整静态站点(含 packages.json、压缩包、autoload 信息) - 把整个
web/目录拷贝到内网服务器,用 Nginx 指向该目录根路径(确保能通过http://192.168.10.100访问到packages.json)
二、配置 Composer 使用本地镜像
内网机器无需联网,只需让 Composer 知道去哪里找包。有两种常用方式:
-
全局配置镜像源(推荐):
composer config -g repos.packagist '{"type":"composer","url":"http://192.168.10.100"}'
这会覆盖默认 packagist.org,所有项目自动走内网源 -
项目级配置(更灵活):
在项目根目录运行:composer config repos.packagist '{"type":"composer","url":"http://192.168.10.100"}'
会在composer.json中添加repositories字段,仅当前项目生效
三、处理私有包与 Git 依赖(无 SSH/Git 协议时)
如果项目依赖内网 GitLab 或私有仓库,而内网不能走 git+ssh 或 https 协议,可转为 dist 方式:
- 将私有包打成 ZIP,放在内网 Web 可访问路径下(如
http://192.168.10.100/dist/mycompany/core.zip) - 在
composer.json中声明为 package 类型:"repositories": [ { "type": "package", "package": { "name": "mycompany/core", "version": "1.2.0", "dist": { "url": "http://192.168.10.100/dist/mycompany/core.zip", "type": "zip" }, "autoload": { "psr-4": { "MyCompany\\": "src/" } } } } ] - 然后
composer require mycompany/core:1.2.0即可安装
四、日常维护与更新策略
离线镜像不是一劳永逸,需定期同步新版本:
- 在联网机器上更新
satis.json的require列表,加入新包或升级版本号 - 重新运行
php bin/satis build,Satis 默认只下载新增/变更的包,已有包跳过 - 用 rsync 或共享目录增量同步
web/到内网服务器(注意保留dist/和packages.json) - 建议加个简单脚本做自动化:拉取、构建、校验、同步、重启 Nginx(如果需要)
基本上就这些。关键不是“完全断网”,而是把网络依赖前置完成。Satis + 静态 Web 服务是最稳定、最易审计的离线方案,比缓存代理类工具(如 Toran Proxy 已停更)更适合企业内网场景。










