satis包列表为空的主因是repositories中源未被识别为可抓取的composer包,需设type为"vcs"、url指向含composer.json的仓库根目录,并确保认证权限;私有包支持dev-main和v前缀tags需配"no-api":true、"branches"及"require-all":true;客户端拉不到包常因repositories配置错误或web服务器禁.json访问;构建慢可加--skip-errors、调内存、限git超时并定期清理dist旧文件。

为什么 satis 生成的包列表总是空的
常见现象是运行 bin/satis build 后,packages.json 里 packages 字段为空,或者浏览器打开仓库首页只显示空数组。根本原因不是配置写错了,而是 satis.json 里 repositories 下的每个源没被正确识别为“可抓取的 Composer 包”。
- 必须确保每个
repository的type是"vcs"(支持git、svn、hg),不能是"package"或漏写 -
url必须指向一个含有效composer.json的仓库根目录(比如https://gitlab.example.com/myorg/mylib.git),不能是 raw 文件链接或网页地址 - 如果用私有 Git 服务,
satis运行时需有对应 SSH key 或 HTTP 认证权限——它不会复用你本地git clone的凭据 - 运行前先手动
git ls-remote <your-url></your-url>测试连通性,失败就别指望satis能扫描到 tag/branch
如何让私有包支持 dev-main 和带 v 前缀的 tag
satis 默认只认符合 semver 规范的 tag(如 1.2.3),但很多团队用 v1.2.3 或直接推 dev-main 分支。不配好,Composer 客户端就拉不到这些版本。
- 在
satis.json的repositories每个项里加"no-api": true,强制 satis 用 git 命令解析分支和 tag,绕过 GitHub/GitLab API 限制 - 加
"branches": ["main", "dev-*"]显式声明要包含的分支("branches": true也行,但会变慢) - tag 名称过滤靠
"require-all": true+"archive": {"skip-dev": false},否则v*tag 会被忽略 - 注意:启用
"archive"后,satis会在输出目录生成dist子目录,客户端走dist下载更稳定,但构建时间明显增加
composer require 报 Could not find package xxx at any version
这通常不是包不存在,而是客户端根本没查你的私有源。Satis 生成的是静态文件,没有后台服务,所以 Composer 必须明确知道去哪找。
- 确认项目
composer.json里写了正确的repositories,且type是"composer",url指向你部署好的packages.json所在路径(例如"https://satis.example.com/packages.json") - 不要把
url写成"https://satis.example.com/"—— Composer 不会自动拼/packages.json - 执行
composer clear-cache,再跑composer require myorg/mylib:dev-main;如果还报错,用composer -v require ...看真实请求的 URL 是否 404 - 检查 Web 服务器是否允许
.json文件被访问(Nginx/Apache 默认可能禁用,需显式放开)
生成速度慢、内存溢出或超时怎么办
satis build 是单进程同步操作,扫几十个仓库时很容易卡住或崩掉,尤其在 CI 环境资源受限时。
- 用
--skip-errors参数跳过个别坏仓库,避免整个流程中断 - 加
--min-stability dev和--prefer-stable控制版本策略,减少需要解析的 tag 数量 - 在
satis.json的repositories数组里,把最常更新的仓库放前面,配合--limit=5先局部验证 - PHP 内存不够?启动时加
php -d memory_limit=-1 bin/satis build ...;别改系统 php.ini,CI 里不生效 - Git 操作慢?设环境变量
GIT_SSH_COMMAND="ssh -o ConnectTimeout=5 -o BatchMode=yes"防卡死
最常被忽略的一点:satis 不会自动清理旧版本归档。每次 build 都会追加新 dist 包,长期运行后磁盘爆满、HTTP 列表响应变慢——得自己写脚本定期删 web/dist/* 里超过 30 天的目录。











