局域网共享 Composer 镜像唯一靠谱方案是部署 Satis 静态镜像或代理服务;path/file 协议仅限本地,不支持跨机访问与语义化版本解析,且无元数据、无容错。

局域网内共享 Composer 镜像,唯一靠谱的路径是部署一个可被 HTTP 访问的静态索引(Satis)或代理镜像服务;用 repositories + path 或本地 file:// 协议根本不能跨机器共享,也不支持语义化版本解析。
为什么 repositories + path 在局域网里完全失效
很多人在 composer.json 里写:{"type":"path","url":"./packages/*"},误以为“放一台机器上大家都能连”。实际它只在当前项目本地文件系统生效:
- 该配置不启动任何 HTTP 服务,其他机器无法通过
http://访问 - Composer 客户端不会去解析远程路径,
file://协议在 Docker、CI 或不同用户权限下基本不可用 - 不生成
packages.json元数据,composer require monolog/monolog会直接报Could not find package - 删掉本地目录,整个依赖树就崩,毫无容错和复用能力
Satis 是局域网共享最轻量且真正可用的选择
Satis 生成纯静态文件(packages.json + dist/*.zip),扔到任意 Web 服务器就能被全网机器访问。适合中小团队、内网隔离、或只同步少量私有包的场景:
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
- 必须用
php bin/satis build satis.json web/手动触发更新,改了某个包的composer.json不会自动感知 - 输出目录(如
web/)要能被 Nginx/Apache 直接映射为https://mirror.internal/packagist.json - 若需包含 Git 源码而非仅 ZIP 归档,必须在
satis.json中显式开启:"archive": {"skip-dev": false} -
"require-all": true和"require"不能混用;"repositories"字段必须是对象数组,不能填字符串 URL
代理镜像(如 packagist-mirror)适合需要秒级同步官方源的团队
如果团队要随时 composer require 任何 Packagist 上的新包(包括 Laravel、Symfony 等带 GitHub ZIP 的大体积 dist),Satis 不行,得上代理型镜像:
- 阿里云开源的
packagist-mirror是 Go 实现,依赖 OSS 存 ZIP、Redis 做队列、Nginx 反向代理,部署门槛高但功能完整 - 必须确保
DIST_URL返回的 ZIP 下载链接与原始包哈希一致,否则composer install会静默失败,且不提示具体哪一环出错 - GitHub API 调用必须配
GITHUB_TOKEN,否则同步大量包时会被限流,导致 dist 缺失、安装卡住 - 镜像域名(如
https://packagist.internal)必须可被所有客户端 DNS 解析,不能只绑localhost或内网 IP(否则composer config repo.packagist composer https://...不生效)
验证是否真能局域网共享,只看这一条命令
别信 curl https://mirror.internal/packagist.json 返回 200 就算通——那只是 HTTP 层面通。真实可用必须走 Composer 自身流程:
- 换一台没配过镜像的机器,执行:
composer create-project --repository-url=https://mirror.internal test-project - 观察是否成功拉取元数据、下载 dist、解压、生成
vendor,且不报hash mismatch或file could not be downloaded - 特别注意:首次使用前务必删掉旧
vendor和composer.lock,否则旧 lock 文件里的 hash 会和新镜像元数据对不上
最关键的细节常被忽略:dist 包的存储路径必须支持软链接(如 ext4/xfs),NTFS 或某些 NAS 不支持会导致 500 错误;而哈希校验一旦出偏差,Composer 就拒绝安装,且错误信息极其模糊——你得自己比对 packages.json 里的 sha256 和实际 ZIP 文件的哈希值。这不是配置问题,是数据一致性问题。

















