不能只改composer config -g repo.packagist,因其仅替换元数据入口(packages.json),zip包仍从原始dist.url(如github)下载,而局域网无法访问github,且国内镜像不托管zip文件;必须确保所有zip可通过局域网http直连get,且satis生成的静态文件需由nginx精确托管、声明json mime类型、url以/结尾,并在项目级composer.json中显式配置私有源并禁用packagist.org。

为什么不能只改 composer config -g repo.packagist
这个命令只替换元数据入口(packages.json),但 ZIP 包仍从原始 dist.url 下载——比如 https://github.com/monolog/monolog/releases/download/2.10.0/monolog-2.10.0.zip。局域网内根本打不开 GitHub,而国内公开镜像(阿里云、USTC)也不托管 ZIP 文件,只缓存 packages.json 和 provider-*.json。
验证真实 ZIP 地址:运行 composer show monolog/monolog --verbose,看 dist.url 字段。别信“换源就完事”,必须让所有依赖的 ZIP 都能通过局域网 HTTP 直接 GET 到。
Nginx 必须精确暴露 Satis 输出目录且声明 MIME 类型
Satis 不是服务,只是静态文件生成器;它不监听端口、不启动进程,只把 packages.json 和 ZIP 写进输出目录。404 不是网络不通,是 Web 服务没暴露对路。
-
root必须精确指向satis.json中output-dir的路径,例如root /var/www/satis/web; - 必须显式声明 JSON MIME 类型:
types { application/json json; },否则返回text/plain,Composer 拒收 - 镜像 URL 必须以
/结尾:"url": "https://pkgs.internal/",少一个斜杠会拼成https://pkgs.internalpackages.json - 检查
dist/下 ZIP 路径是否可直连 GET,例如https://pkgs.internal/dist/monolog/monolog/2.10.0/xxx.zip,SELinux 或文件权限常锁死该路径
项目级 composer.json 的私有源写法才是生效关键
私有源必须写在你要装包的那个项目的根级 composer.json 里,不是 Satis 自己的配置文件,也不是包自己的 composer.json。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 类型必须是
"type": "composer",URL 是托管packages.json的根地址(含末尾/) - 务必加上
"packagist.org": false,且放在repositories数组里,不是嵌套在某个仓库对象内部 - 私有源必须放在
repositories数组第一位,Composer 按顺序查找,不会合并同名包 - 漏掉任意一项,
composer require acme/utils就会报Could not find package acme/utils
网关拦截机制下,require-all: true 是高危配置
它会让 Satis 把 Packagist 所有公开包全量同步,首构建可能超 40GB,加载时内存溢出或超时;更糟的是,它会把 dev- 分支也当版本暴露,导致 composer update 拉到不稳定代码。
真正可控的做法是显式列出需发布的包:
- 在
satis.json的repositories中只声明你真正要托管的 VCS 地址 - 用
"require": {"vendor/package": "1.2.3"}精确控制版本范围,避免拉取未审计的 dev 分支 - 若需部分同步公开包,改用
"require-dependencies": true+ 白名单过滤,而非require-all - 每次
bin/satis build前,先人工 reviewsatis.json和 Git tag 状态,防止误同步
网关层拦截本身不解决元数据与 ZIP 的路径一致性问题,最容易被忽略的是:ZIP 的 dist.url 必须和网关实际转发路径完全一致,且 Nginx 的 rewrite 或 proxy_pass 不能破坏原始路径结构——否则 Composer 解析失败,连错误都报得不明确。










