必须在项目级composer.json中显式声明私有源:repositories数组首项为{"type":"composer","url":"https://satis.your-company.com/"},末尾带斜杠;须紧随其后添加{"packagist.org":false}禁用官方源;认证凭据须单独配置600权限的auth.json。

必须在项目级 composer.json 中显式声明私有源,全局配置(composer config --global)无法绑定认证、且会被项目配置覆盖。
怎么在 composer.json 里加 Satis 私有源
类型必须是 "type": "composer",URL 必须指向 Satis 服务的根路径(如 https://satis.your-company.com),不能是 Git 地址或带 /packages.json 后缀。
- 漏掉
"packagist.org": false—— Composer 会静默跳过你的 Satis 源,继续走官方源 -
"packagist.org": false必须是repositories数组里的独立对象,不能嵌在 Satis 对象内部 - 如果还要装公共包(比如
monolog/monolog),得手动再加一条官方源,并放在"packagist.org": false之后 - 执行
composer config repositories确认输出是数组(不是键值对),否则前面的源会被丢弃
auth.json 怎么配 HTTP Basic 认证
认证信息绝不能写进 composer.json,必须分离到同目录下的 auth.json 文件,权限必须为 600(chmod 600 auth.json),否则 Composer 直接忽略。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 内容格式示例:
{ "http-basic": { "satis.your-company.com": { "username": "deploy", "password": "xxx" } } } - 若 Satis 用 Bearer Token,则填到
"bearer"字段下,结构一致 - 测试是否生效:运行
composer require myorg/utils -v,日志中应出现Reading composer.json of myorg/utils及对satis.your-company.com的GET请求
为什么加了源却还是走 packagist.org
根本原因只有两个:"packagist.org": false 缺失,或 Satis 的 packages.json 根本没包含你要的包名和版本。
- Composer 不 fallback、不报错、不提示,只静默跳过私有源
- 验证 Satis 是否生成目标包:
curl -s https://satis.your-company.com/packages.json | jq '.packages["myorg/utils"]',返回必须是非空对象 - 注意:Satis 是静态索引服务,不是代理;它不会动态拉取未声明的包
- CI/CD 环境中,确保构建 Satis 时已拉取最新代码、且
require或require-all配置正确
混配镜像和 Satis 时顺序怎么排
镜像(如阿里云、腾讯云)只是 packagist.org 的只读代理,不托管私有包。把镜像放 Satis 前面,会导致私有包完全不可见。
- 正确顺序:Satis 源 →
"packagist.org": false→ 镜像源(可选)→ 官方源(仅当需装公共包时) - 错误写法:
{"type":"composer","url":"https://mirrors.aliyun.com/composer/"}放在 Satis 前面 → 私有包永远找不到 - 镜像只加速公共包安装,对私有源无任何作用,别指望它“顺带”代理 Satis
最易被忽略的一点:Satis 服务本身必须已成功构建并生成了 packages.json,且该文件里明确列出了你要安装的包名和版本——否则无论 composer.json 写得多规范,都只是对着空气发请求。










