必须在项目 composer.json 中显式声明私有源,type 为 "composer",url 为可 HTTP 访问的地址,认证需配置 options,多源按数组顺序匹配,包须经 Satis build 生成索引且 name 格式正确。

怎么让 composer 找到你的 Satis 私有源
必须在项目根目录的 composer.json 里显式声明仓库地址,composer 不会自动发现或 fallback 到私有源。
- 用
"type": "composer"声明是标准 Composer 源,不是 VCS 或 package(常见错误:写成"type": "vcs") -
"url"必须是能被composer直接 HTTP GET 的路径,比如"https://packages.your-company.com",不能是 Satis 构建脚本所在服务器路径 - 如果 Satis 页面启用了基础认证,要加
"options": {"http": {"header": ["Authorization: Basic xxx"]}},否则composer update会静默跳过该源 - 多个私有源按数组顺序排列,
composer从左到右尝试匹配包名,重复包名时以第一个命中为准
composer require 安装不了私有包?先查这三件事
90% 的失败不是配置错,而是包没“真正发布”到 Satis 索引里。
- Satis 的
build命令必须成功执行完,且生成了packages.json和对应.zip文件 —— 光跑命令不看输出容易误以为成功 - 私有包的
composer.json中"name"必须是vendor/name格式,且和你在require里写的完全一致(区分大小写) - 运行
composer clear-cache,否则本地缓存可能还在用旧的packagist.org元数据,导致报Could not find package xxx
Satis 配置里 require-all 和 require 的区别很关键
它们决定哪些包会被收录进私有源索引,但行为完全不同。
-
"require-all": true表示拉取所有已知 VCS 仓库(如 GitLab/GitHub)中带合法composer.json的分支/Tag,适合统一纳管内部全部项目 -
"require"是白名单模式,只收录明确列出的vendor/package,例如"acme/utils": "*",适合精准控制 - 如果同时存在,
require-all优先级低于require;但若某包在require中指定了具体版本约束(如"^2.0"),Satis 只收录满足该约束的 Tag,不是所有 Tag
HTTPS + 自签名证书时 composer install 卡住怎么办
不是 composer 不支持 HTTPS,而是它默认校验证书链,而自建 Satis 往往用内网域名+自签证书。
- 临时解决:设环境变量
export COMPOSER_DISABLE_TLS=1(仅限测试环境,生产禁用) - 长期方案:把公司 CA 证书加到系统信任库,并确保 PHP 的
openssl.cafile指向它(可通过php --ini查找配置位置) - 更稳妥的做法是在 Satis 服务端用 Let’s Encrypt 或企业 PKI 签发有效证书,避免每次都要绕过安全检查
composer 就只是安静地失败。










