satis不是“装完就能用”的私有源,因其仅为静态包索引生成器,需配合nginx等web服务器托管生成的packages.json和zip文件,否则composer会因404或仓库类型错误而失败。

为什么 satis 不是“装完就能用”的私有源
因为 satis 本质是个静态包索引生成器,不是运行时服务。它不监听请求、不处理认证、不转发下载——你得自己配 Web 服务器(比如 Nginx)来托管生成的 packages.json 和 ZIP 文件,否则 composer install 会直接报 404 或 Invalid repository type。
常见错误现象:composer update 报 Could not fetch https://your-satis/repo/packagist.json,但 curl 能通——大概率是路径没对齐,或者 Web 服务器没把 index.html 或 packages.json 设为默认入口。
- 确保
satis build输出目录被完整映射到 Web 根路径(例如/var/www/satis/对应https://satis.example.com/) -
satis.json里的output-dir必须是绝对路径,且 Web 用户有读取权限 - 别把
require写成repositories的子项——repositories是顶层字段,放错位置会导致整个配置被忽略
怎么写一个能被 composer 正确识别的 satis.json
核心就三点:源地址、目标输出、包过滤规则。漏掉 name 或 homepage 不影响功能,但某些旧版 Composer 会警告;而缺了 repositories 或 output-dir 直接构建失败。
使用场景:你想把 GitHub 上几个私有库(比如 acme/utils、acme/api-client)聚合进一个源,同时排除 dev 分支和未打 tag 的提交。
-
repositories列表里每个项必须含type: "vcs"和url(支持 Git、GitHub、GitLab,但不支持 HTTPS 私有仓库直连——得配 SSH key 或用 token) -
require-all设为true会拉所有 tag;设为false则必须显式写require: { "acme/utils": "*" } - 加
"minimum-stability": "stable"可过滤掉dev-前缀的分支,避免把开发快照塞进私有源
{
"name": "acme/private-packagist",
"homepage": "https://satis.example.com",
"repositories": [
{ "type": "vcs", "url": "git@github.com:acme/utils.git" }
],
"require-all": true,
"output-dir": "/var/www/satis"
}
composer require 找不到私有包?检查这三处
不是包没生成,而是客户端根本没“看见”它。Composer 默认只查 packagist.org,你得手动告诉它去哪找——而且这个“告诉”必须在项目级或全局级生效,不能只改 satis.json。
常见错误现象:satis build 成功,packages.json 里也有对应包,但 composer require acme/utils 仍报 Could not find package。
- 项目
composer.json里必须有repositories字段,且类型为composer(不是vcs),指向你的 Satis 地址:"repositories": [{ "type": "composer", "url": "https://satis.example.com/" }] - URL 末尾不能带
/packages.json——Composer 会自动拼,多加反而 404 - 如果用了自签名证书或内网域名,需在
composer config -g cafile /path/to/cert.pem配置信任链,否则连接会被拒绝
生成慢、ZIP 包大、更新不及时?这些参数要调
satis build 默认会 clone 每个仓库全量历史,还打包所有 tag 对应的 ZIP。对于大单体库或频繁发版的项目,一次构建可能卡十几分钟,磁盘占用飙升。
性能影响:不加限制时,Satis 会为每个 tag 生成独立 ZIP,哪怕只有几行代码改动;同时并发 clone 多个仓库容易触发 GitHub API 限流(尤其用 token 时)。
- 加
"archive": { "directory": "dist", "format": "zip", "skip-dev": true }可跳过 dev 分支打包 - 用
"only": ["^1.0", "^2.0"]替代require-all,精准控制只收录指定版本范围 - 设置环境变量
GITHUB_TOKEN=xxx再运行satis build,避免匿名请求被限速
容易被忽略的是:Satis 不会自动清理旧 ZIP 文件。上线新 tag 后,老 ZIP 还留在 dist/ 下,既占空间又可能被误引用——得自己加脚本定期清理。











