satis 的“部分同步”需通过 satis.json 的 require 字段显式声明包及版本约束,require-dependencies 控制是否递归拉取依赖;repositories 须规范配置 vcs 源且避免重复添加 packagist;archive 和 output-dir 可精简输出。

Composer 无法原生支持 Satis 的“部分同步”——Satis 本身设计就是全量镜像或按仓库维度同步,所谓“部分同步”必须通过过滤策略在 satis.json 中显式声明,否则会拉取所有匹配包的全部版本。
如何用 require 和 require-dependencies 控制同步范围
Satis 同步范围不取决于你本地 composer.json 写了什么,而完全由 satis.json 的 require 字段决定。它不是“安装依赖”,而是“声明哪些包允许被收录进镜像”。
-
require中列出的每个条目(如"monolog/monolog": "^2.0")会触发 Satis 去 Packagist 或源仓库查找所有满足该约束的版本,并下载其 dist + metadata - 若设
"require-dependencies": true,Satis 还会递归拉取这些包所声明的require依赖(但仅限于已知的、可解析的包名,不会无限展开) - 不写
require或写成空对象{},Satis 默认同步整个源仓库(如 Packagist 全量),极慢且无意义 - 推荐始终显式列出业务强依赖的顶层包,避免意外引入无关包
repositories 配置错误导致“部分同步”失效
常见误操作是把私有 Git 仓库直接塞进 satis.json 的 repositories,结果 Satis 尝试对每个 commit 打包,生成大量无效版本,甚至同步失败。
- 只应在
satis.json中配置"type": "vcs"仓库,且确保该仓库的composer.json里name字段规范(如"acme/utils"),否则 Satis 无法识别和索引 - 不要在
satis.json里重复添加 Packagist 作为 repository——Satis 默认已内置,加了反而可能因 URL 冲突跳过其他源 - 若需混合同步 Packagist + 私有包,用
"repositories": [{"type": "composer", "url": "https://packagist.org"}, {"type": "vcs", "url": "https://git.example.com/acme/utils"}],并确保require中的包名能被任一 source 解析
用 archive 和 output-dir 减少冗余文件
默认 Satis 会为每个包版本生成完整 dist ZIP,并保留所有 tag/branch 的元数据,容易撑爆磁盘。部分同步后更需精简输出。
- 启用
"archive": {"directory": "dist", "format": "zip", "skip-dev": true}:跳过dev-开头的开发分支,只打包带稳定 version tag 的 dist -
"output-dir"必须是绝对路径或相对于satis.json的路径,且 Web 服务器要有读取权限;若路径不存在,Satis 不报错但静默失败 - 若只需 metadata(供 Composer install 时查版本),可设
"archive": false,Satis 只生成packages.json和各包composer.json,体积减少 90%+
真正难的不是写对几行 JSON,而是厘清“同步谁”和“从哪来”的边界——Satis 不是代理缓存,它不转发请求,只做静态快照。一旦 require 错配、repository URL 权限不对、或私有包没打合规 tag,生成的镜像就不可用,而错误往往只在下游 composer install 时才暴露为 Could not find package xxx。











