必须禁用 packagist.org,否则 composer install 会卡死或报 Could not fetch packages;Satis 生成静态 packages.json 和 ZIP 包,需通过 HTTP 可访问,并在项目 composer.json 中显式配置 "packagist.org": false 且 repositories 指向本地地址,同时执行 composer clear-cache 清除旧缓存。

必须禁用 packagist.org,否则 composer install 会卡死或报 Could not fetch packages。Satis 不是代理服务,它生成的是静态文件,离线环境能用的前提是:元数据(packages.json)和 ZIP 包(dist/)都可通过 HTTP 访问,且项目配置明确指向该地址、并切断对公网源的任何 fallback。
为什么 composer install 还是去连 packagist.org
常见错误是只改了 composer.json 的 repositories,却漏掉关键开关:"packagist.org": false。Composer 默认始终 fallback 到官方源,哪怕你写了私有地址,只要没显式禁用,它就会先尝试连外网——内网机器自然超时卡住。
- 项目根目录下
composer.json的repositories必须是数组,每个元素含"type": "composer"和以/结尾的url(如"url": "http://192.168.1.100:8000/") - 同级必须加
"packagist.org": false,不能写在repositories里,也不能写成"packagist": false - 执行前清缓存:
composer clear-cache,否则旧的元数据可能干扰识别
satis.json 配置里最容易失效的三个字段
构建失败或生成的 packages.json 为空,八成是这三个字段写错位置或值非法:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
repositories必须是顶层数组,每个项是完整对象:{"type": "vcs", "url": "https://git.internal/lib"},不能简写为字符串,也不能嵌套在别的字段下 -
require-all或require必须存在且互斥;若用"require": {"vendor/package": "*"},确保该包在repositories列表中已声明,否则 Satis 直接跳过 -
output-dir推荐写绝对路径(如/var/www/satis),相对路径在不同工作目录下容易解析错位,导致后续 Web 服务找不到文件
Nginx 或 Python HTTP 服务必须满足的两个硬性条件
Satis 生成的是纯静态文件,但 Composer 对响应头和路径非常敏感,稍有偏差就 404 或校验失败:
-
packages.json必须返回Content-Type: application/json;Nginx 需加types { application/json json; },Pythonhttp.server默认不设此头,需用python3 -m http.server 8000 --bind 0.0.0.0:8000并确认能curl -I http://localhost:8000/packages.json看到正确类型 - 所有
dist/下的 ZIP 路径必须可直接 GET,例如 Satis 生成dist/vendor-package/abc123.zip,那么访问http://satis.example.com/dist/vendor-package/abc123.zip必须返回 200;Nginx 要确保location /dist/没被 rewrite 或 deny 规则拦截
最常被忽略的一点:Satis 构建时不会验证 Git 仓库是否真有 tag 或合法 composer.json,它只按配置扫描。如果目标仓库没打 tag、composer.json 缺 name 字段,或用了大写字母/下划线,生成的 packages.json 就不会包含该包——而错误日志里往往只有警告,没有中断提示。

















