根本原因是构建环境未就绪:satis是静态生成器,不自动处理git权限、认证、代码拉取等前置条件,需手动确保运行用户能免密clone仓库、output-dir有写权限、satis.json中require或require-all配置完整且版本合法。

php bin/satis build 为什么跑不起来
根本原因不是命令写错,而是构建环境没准备好。satis 是个静态生成器,它不帮你配 Git、不处理认证、也不自动拉代码——所有前置动作都得你手动搞定。
- Git 权限问题最常见:运行
php bin/satis build的用户必须能免密 clone 所有repositories.url地址。SSH 方式要提前把私钥加进~/.ssh/并测试ssh -T git@gitlab.example.com;HTTPS 方式得用git config --global credential.helper store输一次密码,或通过COMPOSER_AUTH环境变量传 token -
version字段非法会静默跳过包:目标仓库的composer.json里如果写了"version": "dev-main",satis 解析失败,直接忽略该包,不会报错,但packages.json里就看不到它 - 输出目录权限不对:satis 要往
output-dir写文件,如果路径是相对路径(比如"web"),且当前工作目录不固定,很容易写到错地方;建议全用绝对路径,比如/var/www/satis/web,并确认 Web 用户有读取权限
composer.json 里怎么写 repositories 才生效
客户端配置错一个字符,整个私有源就形同虚设。satis 生成的是静态 JSON,不提供重定向或兜底逻辑,repositories 必须精准匹配生成路径。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
-
url必须以/结尾:写成"https://packages.internal"会导致 Composer 拼出https://packages.internal/packages.json(404);正确写法是"https://packages.internal/" - 类型必须是
"composer":不能写成"type": "vcs"或漏掉type字段,否则 Composer 当作无效源直接跳过 - 不能依赖 packagist.org 回退:默认情况下 Composer 会同时查 packagist.org,如果你只想走私有源,得显式禁用:
composer config --unset repos.packagist或在composer.json里加"packagist.org": false到repositories数组最前面
satis.json 的 require 和 require-all 到底怎么选
这决定你仓库里到底有没有包,以及有多少版本。satis 不做智能推断,它只按配置硬匹配。
-
"require-all": true会拉所有 tag 和稳定分支(如v1.2.0,1.2.x-dev),但也会把dev-main这类开发分支塞进去,除非你加"minimum-stability": "stable" -
"require"是精确控制:比如"acme/utils": "^2.0",satis 会去每个repositories里找 name 匹配的包,并只收录满足该版本约束的 tag;注意不支持通配符,"acme/*": "*"完全无效 - 如果用了
"require",但对应包在 Git 仓库里没有打任何 tag,satis 就找不到可用版本,packages.json里照样没它——tag 是硬门槛,不是可选项
为什么 composer install --prefer-dist 总是 fallback 到 source
不是网络慢,也不是配置漏了,而是 satis 根本没生成 ZIP 文件。dist 下载路径由 satis 控制,客户端没得选。
- 必须启用
archive配置:satis 默认只生成packages.json,ZIP 得靠显式配置。加这段到satis.json:"archive": { "directory": "dist", "format": "zip", "skip-dev": true } -
dist.url路径要和 Web 服务器对齐:satis 生成的 ZIP 在dist/子目录下,所以 Web 服务必须让https://packages.internal/dist/可访问;Nginx 需确认location /dist/没被 deny 或 rewrite 错 - HTTP MIME 类型错误也会 fallback:如果 Web 服务器返回
text/plain而不是application/zip,Composer 拒绝下载,自动切回 source;检查 Nginx 的types配置是否包含application/zip zip;
packages.json,包一多就卡顿,也没办法监听 Git 推送自动更新。最容易被忽略的是:它不校验你写的 repositories.url 是否真能 clone,也不告诉你哪个包被静默跳过了。上线前务必用 curl https://your-satis-url/packages.json | jq '.packages | keys' 看一眼实际收录了哪些包名。










