satis是静态文件生成器,局域网使用无需外网;构建机需访问git仓库,客户端只需能访问web托管的packages.json和dist zip文件,并在composer.json中禁用packagist.org且声明私有源url以/结尾。

局域网里用Satis,根本不用连外网
只要构建机(运行 satis build 的那台)能访问你的 Git 仓库,其他内网机器就完全不需要外网。Satis 生成的全是静态文件,packages.json 和 dist/*.zip 全部放在 Web 目录下,局域网内任何机器用浏览器能打开 http://192.168.1.100/packages.json,就能被 Composer 正确识别。
常见误区是以为要同步 packagist.org —— 完全不必。Satis 不代理、不转发、不查公网源,它只处理你明确写在 satis.json 里的 repositories 列表,比如:{"type": "vcs", "url": "http://git.internal/project-a.git"}。
- Git 地址必须带
.git后缀,且确保局域网所有机器都能git clone这个地址(HTTP/HTTPS 需开启 Git over HTTP,SSH 需配好公钥) -
homepage填内网可访问地址即可,例如"http://192.168.1.100",结尾不能带斜杠(/),否则 Composer 拼 URL 会多出一个/packages.json - Web 服务(Nginx/Apache)必须返回正确的
Content-Type: application/json,否则 Composer 解析失败
satis.json 里写错这三项,构建就白跑
构建成功不代表可用。很多团队跑完 php bin/satis build satis.json web/,发现 packages.json 为空或包数量不对,问题基本锁定在这三处:
-
repositories必须是数组,每个元素是完整对象,不能只写字符串 URL;例如不能写"https://git.internal/lib",而必须写{"type": "vcs", "url": "https://git.internal/lib.git"} -
require-all和require不能共存;想拉全部 tag/branch 就设"require-all": true,想精确控制就用"require": {"vendor/package": "*"},混用会导致静默跳过 -
output-dir推荐写绝对路径(如/var/www/satis),相对路径容易因工作目录不同导致 ZIP 文件生成位置错乱,进而使 dist URL 失效
客户端 composer.json 必须禁用 packagist.org
哪怕 Satis 仓库已上线、packages.json 可正常访问,只要项目里没关掉默认源,Composer 仍会先去 packagist.org 查一遍,超时后才 fallback——这就是为什么你看到 “Could not fetch https://repo.packagist.org” 或安装卡住。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
必须在项目根目录的 composer.json 中显式声明:
{
"repositories": [
{
"type": "composer",
"url": "http://192.168.1.100/"
}
],
"packagist.org": false
}
注意:"packagist.org": false 是顶层级字段,不是嵌套在 repositories 里;改完之后执行 composer clear-cache,否则旧缓存可能掩盖配置生效状态。
dist ZIP 下载 404?多半是 Web 路径或 MIME 错了
报错 file could not be downloaded 通常不是网络不通,而是 Satis 生成的 ZIP 路径和 Web 服务暴露路径不匹配。Satis 默认把归档放在 dist/vendor-name/package-name/version-hash.zip,这个路径必须能被直接 GET 到。
- Nginx 配置里需加
types { application/json json; },否则packages.json返回text/plain,Composer 拒绝解析 - 确保 Web 根目录就是
satis build的output-dir,不要额外套一层子目录(比如别把web/放进/var/www/html/satis/web/,而应设为/var/www/html/) - 如果用了
"archive": {"prefix-url": "http://192.168.1.100"},那 ZIP 的 URL 就得严格匹配这个前缀,不能多也不能少
最后提醒:Satis 不自动更新,每次私有包发新版、改 composer.json 或打新 tag,都得手动重跑 php bin/satis build。把它当成“快照工具”,而不是“实时镜像服务”。










