Satis build 不能自动运行,因其是无状态静态生成器,不监听变更、不守护进程、不缓存历史,每次执行均为全量重建;自动化需依赖 CI 脚本触发、显式版本约束与构建后校验。

直接用 satis build 命令无法实现“自动构建”,它本身不监听变更、不触发增量更新、也不提供 webhook 或定时扫描能力;必须靠外部脚本或 CI 工具驱动,且每次构建都是全量重跑。
为什么 satis build 不能自己“自动”运行
Satis 是一个静态生成器,不是服务进程——它没有后台守护、不监听 Git push、不轮询仓库、也不缓存上次状态。执行一次 php bin/satis build satis.json web/ 就是读配置 → 拉代码 → 解析 composer.json → 生成 packages.json + dist ZIP → 写文件,完事退出。
常见误解是以为加个 "require-dependencies": true 就能“自动发现新依赖并加入”,其实它只在本次构建中递归抓取已声明包的依赖,不会记住上一轮有哪些包、哪些版本已存在。
- Git 新打了 tag?Satis 不知道,除非你再跑一遍 build
- 某个仓库删了旧 tag、改了 version 字段?Satis 不校验历史,只按当前配置重新拉取
- 想只更新某几个包?不行,
require和require-all是互斥开关,没有 partial update 模式
可行的自动化路径:CI 脚本 + 版本锚点控制
真正落地的自动构建,得靠外部调度。核心思路是:把构建动作绑定到可信事件(如 Git 配置仓库变更),并用明确的版本标识避免重复或遗漏。
- 用一个独立的 Git 仓库托管
satis.json和构建脚本(比如叫satis-config),每次修改配置就 push,触发 CI - CI 脚本中先
git pull最新satis.json,再执行php bin/satis build satis.json /var/www/satis/ - 关键:在
satis.json中用"require"显式列出包名和约束(如"vendor/package": "1.2.*"),而不是依赖"require-all": true—— 这样每次构建目标确定,结果可预期、可 diff - 构建后加一步校验:
curl -sI https://packages.example.com/packages.json | grep "200 OK",失败则告警
容易被忽略的权限与路径陷阱
自动化脚本跑通一次不等于稳了,下面这些点在无人值守时最容易静默失败:
-
satis命令不在 CI runner 的$PATH中:别依赖全局安装,直接用php vendor/bin/satis(如果你是create-project方式部署) - Git 拉取失败不报错:Satis 默认遇到 clone 失败会跳过该仓库,
packages.json里包数变少但 exit code 仍是 0;加-v参数并 grep 日志里的Cloning into或Could not fetch - dist ZIP 生成失败却没提示:检查
archive.directory对应目录是否可写,且 Web 服务器(Nginx/Apache)用户有读取权限;否则客户端composer install会 fallback 到 source,慢且可能失败 - PHP memory_limit 不够:尤其
require-all: true扫几百个仓库时,Allowed memory size exhausted很常见;CI 中需提前设php -d memory_limit=1G bin/satis build ...
客户端感知不到更新?大概率是缓存没清
即使 Satis 构建成功、Web 服务返回 200,Composer 客户端仍可能装旧包——因为 Composer 本地缓存了 packages.json 的响应。
- CI 构建完成后,建议顺手跑一条
composer clear-cache(如果能在客户端机器执行) - 更稳妥的做法是在构建脚本末尾加个 HTTP 请求:
curl -X PURGE https://packages.example.com/packages.json(需 Nginx 配置proxy_cache_purge) - 或者让客户端项目显式加
"minimum-stability": "dev"和"prefer-stable": false,避免 Composer 因稳定性策略忽略新 tag
真正的“自动”不是让 Satis 变聪明,而是用确定性配置 + 明确触发点 + 关键环节校验,把不可控的手动步骤压缩到零。最脆弱的一环永远不是 build 命令本身,而是构建前后那些没人盯着的权限、网络、缓存细节。


















