Satis不是镜像站而是静态包生成器,仅生成packages.json和ZIP文件,需Nginx/Apache托管、homepage末尾带/、repositories为顶层数组、显式禁用packagist.org且客户端配置URL必须完全匹配。

“镜像站”这个词用错了,Satis 不是镜像服务
直接说结论:Satis 不提供实时同步、不代理请求、不转发 ZIP 下载,它只生成静态文件。你把它当“镜像站”来配,composer install 一定会随机失败或拉不到 ZIP。国内阿里云、USTC 那种“镜像”也一样——它们只缓存 packages.json,所有 dist.url(比如 GitHub Releases 链接)仍直连原始地址,而这些地址受 rate limit 和 OAuth 限制,内网根本打不开。
真正能解决企业内部加速 + 可控 + 离线安装的,是让 Satis 把包全部打包成 ZIP,并托管在你自己的 Web 服务器上。这时 dist.url 指向的是你内网可访问的 https://packages.internal/dist/xxx.zip,不再依赖外部网络。
satis.json 配置最容易漏掉的三个硬性字段
不是写完就跑得通。少一个,composer install 就报 Could not fetch packages.json 或 invalid repository type。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
"name"和"homepage"必须同时存在,且homepage是完整 URL(末尾带斜杠,如https://packages.internal/),它决定所有 ZIP 的前缀路径 -
"repositories"必须是顶层数组,不能嵌套在require或其他字段下;每个项"type": "vcs",URL 要能被构建机git clone通(SSH 要配好~/.ssh/config,HTTPS 要提前git config --global credential.helper store) - 必须显式禁用官方源:
"packagist.org": false,否则同名包可能从官网拉取,版本错乱甚至覆盖私有逻辑
Web 服务器托管 packages.json 和 ZIP 的关键配置
Satis 输出的是纯静态文件,不是 PHP 应用。Nginx/Apache 配错,curl https://packages.internal/packages.json 能通,但 Composer 就 404。
-
output-dir(如"web")对应 Web 服务器的root路径,确保packages.json在根目录可 GET(即 URL 是https://packages.internal/packages.json,不是/repo/packages.json) - Nginx 需加
index packages.json;,否则访问根路径会 fallback 到index.html(Satis 默认不生成这个) - ZIP 所在目录(如
dist/)必须可公开读取,且archive.prefix-url值要和实际 URL 完全一致(包括协议、域名、路径末尾斜杠) - 内网 HTTP 或自签名 HTTPS?客户端项目里得加
"secure-http": false,否则 Composer 直接拒绝连接
客户端 composer.json 怎么写才真正生效
不是把 URL 往 repositories 里一塞就完事。顺序、类型、开关三者缺一不可。
-
repositories必须放在项目composer.json的顶层,不能嵌套;"type": "composer"不能省略(旧版 Composer 不认默认值) - 私有源 URL 必须和 Satis 的
homepage完全一致(https://packages.internal/≠https://packages.internal) - 私有源必须排在
repositories数组第一位,Composer 按顺序查找,不会合并同名包 - 如果用了
require-all: true,但某些包没生成 ZIP,大概率是目标仓库没打合规 tag(v1.2.0可以,dev-main不行,除非设"minimum-stability": "dev")
最常被忽略的点:Satis 构建过程不校验凭据,也不提示 Git 失败。构建日志里出现 skipping package,往往是因为 SSH 连不通或 HTTPS 凭据失效,但命令仍返回 0 —— 你得手动检查输出目录里有没有对应 ZIP 和 packages.json 是否包含该包。

















