私有源必须写在项目根目录 composer.json 的 repositories 数组中;仅支持 path、vcs、composer 三类 type,对应不同 url 格式与认证方式;同名包按 repositories 顺序优先匹配;类加载失败多因 autoload 配置错误或未执行 dump-autoload。

私有源必须写在项目 composer.json 的 repositories 数组里
Composer 不会扫描你硬盘上任意目录,也不会读取私有包自己 composer.json 里的 repositories。它只认当前项目根目录下 composer.json 中的 repositories 字段,且必须是 JSON 数组形式。
常见错误包括:
- 把
repositories塞进私有包自己的composer.json—— 完全无效 - 写成对象而非数组,比如
"repositories": { "my-repo": { ... } }—— 解析失败,静默忽略 - 漏掉
type或url字段,或type写成git、github等非法值
正确写法(以 path 类型为例):
{
"repositories": [
{
"type": "path",
"url": "./packages/hoo-log"
}
]
}
不同私有源类型对应不同的 url 和认证方式
type 决定了 url 格式和凭据注入方式,不能混用:
-
path:url 必须是相对路径(如"./packages/my-utils"),禁用file://、~/、绝对路径;Windows 下统一用/分隔符 -
vcs:url 是 Git 仓库根目录地址(如"https://gitlab.example.com/myorg/utils.git"),不能是网页链接或带.git后缀的 tag 页面;凭据走auth.json的http-basic字段,key 是域名 -
composer:url 是私有 Packagist 实例地址(如"https://repo.packagist.com/myorg/"),绝对不能加.git;凭据同样靠auth.json,但需确认服务端支持该协议
auth.json 必须放在项目根目录(与 composer.json 同级)或 COMPOSER_HOME,且权限必须为 600,否则 Composer 静默跳过。
同名包加载顺序决定实际使用哪个版本
Composer 按 repositories 数组从上到下匹配,第一个命中就停。如果你的私有包和公共包同名(如 acme/utils),而私有源排在后面,composer require acme/utils 就会拉 public packagist 的版本。
解决办法:
- 把私有源放在
repositories数组最前面 - 确认私有源中该包确实已发布(vcs 类型看 Git tag,Private Packagist 默认不同步
dev-main分支) - 运行
composer show acme/utils查看实际解析来源,避免误判
装上了但 Class not found?问题大概率不在 repositories
成功执行 composer require hoo/log 并看到 Installing hoo/log 日志,不代表类能自动加载。90% 的“找不到类”问题出在以下环节:
- 本地包的
composer.json缺autoload配置,或 PSR-4 命名空间与目录结构不匹配(如"Hoo\Log\": "src/"但实际类文件在src/Log/Logger.php) - 没运行
composer dump-autoload,导致新注册的命名空间未写入vendor/autoload.php - 框架(如 Laravel、ThinkPHP)需要手动注册 Service Provider 或 Facade,Composer 不会自动处理这部分
别急着改 repositories,先检查 vendor/composer/autoload_psr4.php 里有没有你期望的映射项。


















