Composer必须在composer.json中用JSON数组显式声明repositories,顺序决定查找优先级,命中即停;"packagist.org": false须单独成项;vcs类型需匹配Git tag、minimum-stability和认证配置。

Composer 本身不自动识别私有仓库,必须在项目根目录的 composer.json 中显式声明 repositories,否则 composer require 会直接报 “Could not find package” —— 这不是权限问题,是根本没告诉 Composer 去哪找。
怎么写对 repositories 数组
它必须是 JSON 数组,不能是对象;顺序决定查找优先级,Composer 按从左到右匹配,命中即停。
- ✅ 正确写法:
"repositories": [ { "type": "vcs", "url": "https://git.internal/utils" }, { "packagist.org": false } ] - ❌ 错误写法:
"repositories": { "utils": { "type": "vcs", ... } }(会被忽略) - ⚠️
"packagist.org": false必须单独作为数组中的一项,不能塞进其他仓库对象里 - 多个私有源时,把最常用、最稳定的放前面;
vcs和composer类型可混用,但别和path在生产环境共存
vcs 类型拉不到 dev-main?检查这三件事
写 "myorg/utils": "dev-main" 却安装失败,大概率不是网络问题,而是版本发现机制卡住了。
- Git 仓库必须打了符合语义化格式的 tag(如
v1.0.0),否则 Composer 默认只认dev-main这类虚拟版本 - 根
composer.json缺"minimum-stability": "dev"和"prefer-stable": false,Composer 会跳过dev-前缀的分支 - HTTPS URL 没带认证凭据(如 GitHub PAT),
git clone阶段就卡住或报错Authentication failed;SSH 地址则要求本地ssh-agent已加载对应密钥
认证凭据只能放 auth.json,且路径和权限不能错
composer.json 里写密码或 token 是高危操作,Composer 强制拒绝读取这类凭据 —— 它只信任两个位置的 auth.json,且文件权限必须是 600。
立即学习“PHP免费学习笔记(深入)”;
- 项目级(推荐):
./auth.json,内容如{ "http-basic": { "git.internal": { "username": "deploy", "password": "xxx" } } } - 全局级(慎用):
~/.config/composer/auth.json(Linux/macOS)或%APPDATA%Composeruth.json(Windows) - CI 环境不要用
composer config --global写凭据,应通过COMPOSER_AUTH环境变量注入 JSON 字符串 - SSH 方式无需
auth.json,但git@地址必须能被当前用户git clone通
autoload 生效但类找不到?路径和 dump 时机不对
私有包里的 "psr-4": {"MyOrg\Utils\": "src/"} 是对的,但实际类加载失败,往往是因为两件事没做。
- 私有包通过
vcs安装后,它的autoload规则是 Composer 在安装时读取并写入主项目的vendor/composer/autoload_psr4.php的 —— 你改了私有包的composer.json后,必须手动运行composer dump-autoload才会刷新映射 -
src/是相对于私有包自身根目录的,不是主项目;如果误写成"src/Utils/",就会导致命名空间和物理路径不匹配 - 用
composer show myorg/utils --all可确认 Composer 是否识别出该包,以及它解析出的 autoload 规则是否和你预期一致
最容易被忽略的是:私有 VCS 包的版本完全由 Git tag 决定,composer.json 里的 version 字段会被无视;打完 tag 后强制推送,Git 服务器缓存可能没更新,Composer 仍拉旧 commit —— 此时得清 Composer 缓存或等服务端刷新。



















