satis必须联网构建,因其本质是“抓包+打包”脚本,需实时访问github、gitlab或packagist.org获取元数据和zip下载地址;无网时会因无法连接api或源而失败,且所有依赖(含dev及间接依赖)必须在构建阶段一次性拉全,否则离线安装必报错。

不能直接在无网机器上搭建 Satis 镜像站——Satis 必须联网构建,离线环境只能用它生成的静态文件。
为什么 satis build 必须在有网机器上运行
Satis 不是服务进程,也不缓存流量;它本质是一个“抓包+打包”脚本。构建时需实时访问 GitHub、GitLab 或 packagist.org 获取 composer.json、tag 列表、dist ZIP 下载地址,甚至触发 GitHub API 拉取 release assets。无网环境下执行 satis build 会卡在 Could not fetch https://api.github.com/... 或直接报 Connection refused。
- 所有依赖包(包括
require-dev和间接依赖)都必须在构建阶段一次性拉全,漏一个,离线安装就失败 - 若项目用了
"minimum-stability": "dev",还得确保"require-dev-dependencies": true,否则dev-main分支不会进索引 - 构建机器的 PHP 版本、扩展(如
openssl、zlib)必须和离线机一致,否则 ZIP 解压或 autoloader 可能出错
packages.json 404 的真实原因不是网络,而是路径错位
多数人以为“局域网通了就能用”,结果 composer install 报 Could not fetch https://satis.internal/packages.json。这不是 DNS 或防火墙问题,而是 Web 服务器根本没把请求落到正确文件上。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
satis.json中"output-dir": "/var/www/satis",但 Nginx 的root指向的是/var/www/html→ 请求https://satis.internal/packages.json实际查的是/var/www/html/packages.json,必 404 - URL 缺少末尾斜杠:
"url": "https://satis.internal"会导致 Composer 拼成https://satis.internal/packages.json;而正确路径应为https://satis.internal//packages.json(注意双斜杠),Nginx 常因重定向丢掉第二个/,最终 404 - Nginx 未配置
application/jsonMIME 类型 → 返回Content-Type: text/plain,Composer 解析失败,报invalid repository type URL
客户端 composer.json 必须显式声明 + 彻底禁用 packagist.org
即使 Satis 服务完全正常,只要项目级 composer.json 没改,Composer 就默认走官方源。全局配置(composer config -g)在 CI、Docker 构建中常被忽略,不可靠。
-
"repositories"必须是顶层字段,且第一个仓库就是你的私有源:{"type": "composer", "url": "https://satis.internal/"}(结尾斜杠不能少) - 必须加
"packagist.org": false,否则同名包仍会 fallback 到公网,且可能覆盖你镜像的版本 - 不要写
"type": "path"或"type": "artifact"—— 这些不走 HTTP,其他机器访问不了,不是局域网方案
dist ZIP 文件下载失败,90% 是 Web 服务器权限或路径没放开
Satis 生成的 ZIP 路径形如 dist/vendor-package/12345678.zip,这个路径必须能被直接 GET 到。Nginx 默认禁止点开头或含 .. 的路径,也可能因 location 规则拦截 ZIP 请求。
- 确认 Nginx 配置中没有
location ~ \.zip$ { deny all; }这类规则 - 检查 ZIP 文件权限:Web 用户(如
www-data)必须有读权限,且所在目录可遍历(drwxr-xr-x) - dist 目录不能被
alias指令错误映射;推荐用root /var/www/satis;+ 标准路径拼接,而非alias /var/www/satis/dist;
最关键的遗漏点:Satis 不分析你的项目 composer.json,它只认自己配置里的 require 列表。哪怕你只漏了一个 psr/log,composer install 就会在最后一步报 Package not found——而且不提示缺哪个,只能靠 composer show --tree 在联网机上手动展开全依赖树再核对。










