在 composer.json 中声明私有 Git 仓库需在 repositories 字段添加 type 为 "vcs"、url 为完整 Git 地址的对象;私有库自身 composer.json 必须包含合法 name 和 version(或分支别名);推荐用 HTTPS + git credential 避免 token 明文;注意稳定性约束与缓存问题。

怎么在 composer.json 里声明私有 Git 仓库
Composer 本身不直接“设置”私有仓库,而是靠 repositories 字段告诉它:某个包的源不在 packagist.org,而是在你指定的 Git 地址。这一步必须手动写进项目根目录的 composer.json 中。
常见错误是把私有仓库配置写在全局 config.json 里——没用,Composer 只认当前项目的 composer.json(或通过 COMPOSER_HOME 指向的全局配置,但仅限认证等少数项)。
-
repositories必须是数组,每个元素是一个对象,type设为"vcs" -
url填完整 Git 地址,支持https://、git@、ssh://等协议,但 HTTPS 更易配合 token 认证 - 如果私有库已发布到 Packagist(只是私有可见),不需要加
repositories—— 只需确保 token 有效且 Composer 能访问
示例(HTTPS + personal access token):
{
"repositories": [
{
"type": "vcs",
"url": "https://token:x-oauth-basic@github.com/your-org/private-package.git"
}
]
}
Git 仓库的 composer.json 必须有 name 和 version
你的私有 Git 仓库自己也得是个合法的 Composer 包,否则 composer require 会报错:Could not find package xxx at any version。核心就两点:根目录要有 composer.json,且里面必须含 name(格式为 vendor/name)和明确的 version(或使用分支别名如 "dev-main as 1.0.x-dev")。
容易踩的坑是只写了 name,没写 version,或者用了不规范的分支名(比如 feature/login),导致 Composer 无法解析成稳定版本。
- 推荐用语义化标签(
v1.2.0)打 release,Composer 自动识别为稳定版 - 若走分支开发,必须在
composer.json里用branch-alias或 require 时显式写"dev-main" -
name中的vendor部分要和你在 Packagist 或私有仓库注册的命名空间一致,否则可能被当作不同包处理
HTTPS 认证失败?优先用 git config 而非 URL 写死 token
把 token 明文塞进 composer.json 的 URL 里,既不安全也不便维护。更稳妥的做法是让 Git 自己处理凭证,Composer 会自动复用。
运行以下命令一次,Git 就会记住该域名的凭据:
git config --global credential.helper store
然后首次 clone 私有仓库时输入用户名+token(GitHub/GitLab),Git 会存入系统凭据管理器。后续 Composer 执行 install 或 update 时,只要用的是 HTTPS 地址,就会自动带上认证。
- Windows 上默认走 Windows Credential Manager;macOS 走 Keychain;Linux 多数需额外装
libsecret或改用cache模式 - 避免用
git@SSH 地址配密码——SSH 密钥不支持密码交互式输入,CI 环境容易卡住 - CI/CD 中建议用
GITHUB_TOKEN环境变量 +git config注入,而不是拼接 URL
require 时为什么找不到包?检查 autoload 和 stability
即使 repositories 和私有库的 composer.json 都写对了,composer require vendor/name 仍可能失败,典型原因是稳定性约束(stability)不匹配。
Composer 默认只装 stable 版本。如果你的私有库只有 dev-main 分支、没打 tag,就必须显式允许开发版:
composer require vendor/name:dev-main
或者在项目 composer.json 顶层加:
"minimum-stability": "dev", "prefer-stable": true
-
autoload段落缺失会导致类找不到,但不会阻止 install;它影响的是运行时自动加载,不是安装阶段 - 私有包若依赖其他私有包,每个都得单独加进
repositories,Composer 不递归查找 - 运行
composer show -p可确认私有包是否已被识别;composer update --dry-run能提前暴露解析失败问题
最常被忽略的是:私有仓库的 name 必须全局唯一,且不能和 packagist.org 上已有包重名——哪怕你删了那个包,Composer 缓存里还记着,得清缓存再试。










