composer config -g repo.packagist 无法启用 Satis 私有源,因其仅修改 packagist.org 代理地址,不写入 repositories 字段;Satis 源必须在项目 composer.json 顶层显式声明为索引数组、URL 以 / 结尾、同级配置 "packagist.org": false,并清除 vendor/ 和 composer.lock 后生效。

为什么 composer config -g repo.packagist 不能让 Satis 私有源生效
这条命令只改 packagist.org 的元数据代理地址,对 Satis 这类 type: "composer" 的私有源完全无效。它不写入 repositories 字段,也不影响项目里声明的源;更关键的是,一旦你在项目 composer.json 里写了 "packagist.org": false,全局配置就彻底被屏蔽。
repositories 数组必须显式声明 Satis 源且顺序不能错
Satis 是独立源,必须在项目级 composer.json 的顶层 repositories 字段中显式列出,且顺序决定查找优先级:
- 私有源(Satis)必须放在第一位,否则同名包会被官方源覆盖
- URL 必须以
/结尾,比如"https://pkgs.internal/",少斜杠会拼成https://pkgs.internalpackages.json→ 404 - 必须是索引数组,不是关联数组:
[{"type": "composer", "url": "..."}, ...],写成{"satis": {...}}会导致 Composer 只读第一个键、其余静默丢弃 - 末尾加
{"packagist": true}是可选兜底,仅查元数据,不下载 ZIP,适合防新包漏索引
客户端禁用 packagist.org 是硬性前提
不加这句,Composer 默认仍会 fallback 到官方源,Satis 里的同名包永远不被选用:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 必须写
"packagist.org": false,不能写成"packagist": false或"packagist.com": false - 该字段必须和
repositories同级,放在composer.json顶层 - 改完后务必删掉
vendor/和composer.lock,否则旧 lock 文件仍指向原源,校验失败 - 如果部署包里已含
vendor/,说明镜像配置从未真正生效过,属于“伪打包”
验证 Satis 镜像是否真被 Composer 识别
别等 composer install 卡住才排查——它卡在 Resolving dependencies 阶段时,大概率根本没连你配的 Satis 地址:
- 运行
composer config --list | grep repositories,确认输出包含你的 Satis URL - 手动
curl -I https://pkgs.internal/packages.json,响应头必须含Content-Type: application/json,否则 Composer 静默跳过 - 检查 Web 服务器是否把
packages.json设为默认索引,或 Nginx 是否配置了types { application/json json; } - 内网环境若禁 HTTPS 重定向或拦截
file_get_contents,需临时关校验:composer config -g secure-http false
最常被忽略的是:Satis 生成的是静态文件,必须由 Web 服务托管并正确返回 packages.json,且路径、响应头、SSL 证书三者缺一不可。任何一环出偏差,Composer 都不会报明确错误,只会静默 fallback 或 404。

















