阿里云不提供composer私有仓库服务,所谓“阿里云私仓”实为误称;正确做法是用阿里云oss或ecs自建satis服务,并通过composer config指向该私仓url,而非使用只读镜像源。

阿里云本身不提供 Composer 私有仓库服务(如 Satis 或 Private Packagist 那样的托管型私仓),所谓“阿里云私有仓库”实际是误称——你真正要配的是:用阿里云对象存储(OSS)或 ECS 自建的 Satis/Toran 服务,再通过 composer config 指向它。直接拿阿里云镜像源(https://mirrors.aliyun.com/composer/)当私仓用,根本无法托管你自己的包。
为什么不能把阿里云镜像当私有仓库用
阿里云镜像只是 Packagist 的只读缓存,不支持上传、认证、私有包索引。你执行 composer publish 或类似操作会失败,因为该地址根本不接受 POST 请求;访问 https://mirrors.aliyun.com/composer/packages.json 可以看到它只返回公共包列表,没有你的 vendor/private-package。
- 镜像源地址(如
https://mirrors.aliyun.com/composer/)类型必须是composer,且只读 - 私有仓库必须自己部署 Satis、Toran Proxy 或 Private Packagist,并暴露一个带
packages.json的 HTTP 接口 - 若强行在
repositories里填阿里云镜像并 require 私有包,会报错:Could not find package vendor/name at any version
如何用阿里云 OSS + Satis 搭建可落地的私仓
推荐方案:在阿里云 ECS 上部署 Satis,把生成的静态包目录推送到 OSS,再用 OSS 静态网站功能对外提供服务。这样既利用阿里云基础设施,又符合 Composer 协议。
- 先在 ECS 安装 Satis:
composer create-project composer/satis --stability=dev - 写
satis.json,明确列出你的私有 Git 仓库(type: "vcs")和要发布的包名 - 运行
php bin/satis build satis.json web/,生成packages.json和 dist 包 - 把
web/目录同步到阿里云 OSS Bucket(开启静态网站托管,获取类似https://your-bucket.oss-cn-hangzhou.aliyuncs.com的域名) - 最终仓库 URL 是这个 OSS 域名,不是阿里云镜像地址
全局配置该私仓时必须设对 type 和 auth
一旦你有了可用的私仓地址(比如 https://pkgs.example.com),全局配置命令必须带 composer 类型,且认证信息单独存进 auth.json:
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
- 添加仓库:
composer config --global repositories.my-private-repo composer https://pkgs.example.com - 如果私仓需要 Basic Auth:
composer config --global http-basic.pkgs.example.com username password - 如果用 Bearer Token:
composer config --global bearer-token.pkgs.example.com your-token - 验证是否写入:
cat ~/.composer/config.json和cat ~/.composer/auth.json
注意:repositories.my-private-repo 中的 my-private-repo 是任意别名,但不能含点号(.)或空格;http-basic 键名必须与域名完全一致(不含协议、路径)。
项目级覆盖全局私仓配置的常见陷阱
只要项目根目录 composer.json 里有 "repositories" 字段,全局配置就失效——哪怕你只写了 "repositories": [] 或 "repositories": {"packagist.org": false}。
- 检查方式:
grep -A5 '"repositories"' composer.json - 临时禁用项目级配置:
composer config --unset repositories(无-g) - 想保留项目级定义但叠加私仓?得显式写全:
"repositories": [{"type":"composer","url":"https://pkgs.example.com"},{"packagist.org":false}] -
composer diagnose输出中 “Repo:” 行必须显示你的私仓地址,否则说明没生效
真正难的不是搭服务,而是让 Composer 在每一层配置(全局 / 项目 / 环境变量)里都按你预期走 —— 尤其当 CI 环境和本地开发环境共用同一份 composer.json 时,repositories 字段极易成为隐形冲突源。










