satis是静态包仓库生成器而非镜像服务,它通过扫描指定vcs仓库、打包tag为zip并生成packages.json等静态文件,由web服务器托管,适用于内网管控与离线环境,不支持实时同步。

直接结论:企业级 Composer 私有镜像不推荐自建“镜像站”,而应优先用 Satis 生成静态包仓库,或采购 Private Packagist;若硬要镜像 Packagist.org 官方源,必须搭配反向代理 + 缓存策略 + token 鉴权,否则极易因 rate limit、403 或 CDN 路由失效导致 composer install 随机失败。
为什么不能简单用 composer config -g repo.packagist 指向一个“镜像地址”?
这个命令只改写 Packagist 的元数据入口(packages.json),但不接管实际 ZIP 包分发。一旦你配置了 https://mirrors.aliyun.com/composer/,Composer 仍会从原始包的 dist.url(比如 GitHub Releases、GitLab artifacts)拉取 ZIP,而这些地址不受镜像控制——阿里云镜像本身也不托管 ZIP,只是做元数据缓存和 redirect。结果就是:元数据能快,ZIP 下载依然慢、超时、404 或被限流。
- 查看某个包的真实 ZIP 地址:
composer show vendor/package --verbose,留意dist.url字段 - 国内镜像(如阿里云、USTC)只缓存
packages.json和provider-*.json,不存 ZIP 文件 - 真正“全量镜像”需自己部署
nginx或varnish反向代理,并在响应头中透传X-OAuth-Scopes,否则 GitHub/GitLab 的 ZIP 下载会 403
Satis 是什么,它怎么解决私有包分发问题?
Satis 不是镜像工具,而是“静态包仓库生成器”:它扫描你指定的 VCS 仓库(GitHub/GitLab),把每个 tag 打包成 ZIP,再生成索引页和 packages.json,最终输出一整套可托管在任意 HTTP 服务上的静态文件。它天然绕过所有 OAuth 和 rate limit 问题,因为 ZIP 全部由你自己的服务器生成并托管。
- 关键配置项:
"archive": {"directory": "dist", "format": "zip", "prefix-url": "https://your-company.github.io/composer-packages/dist/"}—— 这个prefix-url必须可公开访问,且路径末尾带/dist/ - 打包时默认跳过
dev-分支,如需包含,设"skip-dev": false - 生成后,只需把整个
public/目录扔到 GitHub Pages、Nginx 或 S3 上即可,无需 PHP 运行环境 - 更新方式不是实时同步,而是定时跑
php bin/satis build satis.json public/,适合 CI 触发
Private Packagist 和 Satis 的核心差异在哪?
差异不在功能多寡,而在运维模型:Private Packagist 是“托管式服务”,Satis 是“静态产物”。选错会导致团队长期维护成本飙升。
- Private Packagist 自动监听 Git Webhook,新 tag 推送即触发构建,支持细粒度权限(如某组只能读
auth-sdk)、Web UI 管理、包文件镜像容灾——适合 50+ 开发者、多 Git 平台(GitHub + GitLab + SVN)的企业 - Satis 没后台、没权限系统、没 Webhook,全靠你写脚本调用
satis build,适合 10–30 人团队、全部用 GitHub、对成本敏感、能接受每天 cron 同步一次的场景 - 二者都不解决“私有包代码泄露”问题——代码安全靠 Git 仓库本身的访问控制(private repo / SSH key / PAT),不是靠 Composer 工具层
最容易被忽略的三个落地细节
很多团队卡在最后一步,不是不会配,而是忽略了这三点:
-
composer.json中的repositories必须写完整 URL,且结尾不带/,例如:"https://your-company.github.io/composer-packages",多一个/就会拼出.../packages.json/导致 404 - 私有包的
name(如"myorg/auth-sdk")必须和 GitHub 仓库名严格一致,大小写敏感;若用 GitLab 子组路径,name也得写成"myorg/subgroup/auth-sdk" - CI 构建 Satis 时,必须提前配置好
github-oauth或gitlab-token,否则satis build会因无法 clone 私有仓库而静默失败(日志里只报 “Cloning into … Permission denied”)











