私有源配置必须精确:repositories须为数组、type与url匹配、url末尾需加/、packagist.org须显式禁用;auth.json权限需600且位置正确;satis的dist.url须指向内网可访问zip地址,nginx需配置json mime类型。

私有源搭建本身不难,难在配置生效的每一步都必须精确——错一个字段、少一个斜杠、权限不对、路径写错,composer require 就会静默失败,只报 Could not find package,连哪错了都不告诉你。
为什么 composer.json 里加了 repositories 还是找不到包
因为 Composer 只读取你当前执行命令的那个项目的顶层 composer.json,不是私有包自己的,也不是 Satis 的,更不是全局 config。常见失效点:
-
repositories写成了对象(如{"my-repo": {...}}),必须是数组:[{"type": "composer", "url": "https://pkgs.internal/"}] -
type写成"git"或"vcs"却配了composer类型的 URL,类型和 URL 必须匹配 -
url缺末尾/,比如写成"https://pkgs.internal",实际请求会变成https://pkgs.internalpackages.json→ 404 - 没禁用官方源:
"packagist.org": false没加进repositories同级的packagist字段,导致同名包优先从 packagist.org 解析
auth.json 怎么放、怎么写才有效
凭据不是“写了就认”,而是位置、权限、字段名三者全对才行:
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
- Linux/macOS 下必须放在
~/.composer/auth.json(全局)或项目根目录(仅限该次命令),且运行chmod 600 auth.json;权限不对,Composer 直接忽略,不报错 - GitLab 私有库用
http-basic字段,key 是域名(如"gitlab.example.com"),不能带端口或路径 - GitHub 必须用
github-oauth字段,key 是"github.com",value 是 Personal Access Token - CI 环境推荐用
COMPOSER_AUTH环境变量传 JSON 字符串,避免文件挂载失败
Satis 构建后为什么 composer install 还是走外网下载 ZIP
因为 Satis 只生成静态文件,不接管 dist 下载逻辑——它生成的 packages.json 里每个包的 dist.url 字段,必须指向你内网可直连的 ZIP 地址。否则 Composer 仍会尝试从原始地址(如 GitHub)下载。
- 检查真实 dist 地址:
composer show vendor/package --verbose,看输出里的dist.url - Nginx 必须把
output-dir设为 root,并显式声明 MIME:types { application/json json; },否则返回text/plain,Composer 拒收 - ZIP 文件路径由 Satis 自动生成(如
dist/vendor-package/1.2.0/xxx.zip),Web 服务必须允许该路径被 GET,SELinux 或文件权限常锁死它 - 确保
satis.json中homepage和客户端repositories.url完全一致,且以/结尾
最易被忽略的是:Satis 不支持增量更新,每次 satis build 都是全量重刷。如果你依赖自动同步,得自己写脚本监听 Git push 并触发构建,否则新 tag 永远不会出现在私有源里。










