在 composer.json 的 repositories 中声明私有 Gitee 仓库需设 type 为 "vcs",URL 格式为 "https://oauth2:TOKEN@gitee.com/org/repo.git",且必须以 .git 结尾;包需打语义化版本 tag(如 v1.0.0)并确保 name 字段匹配 require 名称。

composer.json 里怎么写 gitee 私有仓库地址
gitee 私有库不能直接用 https://gitee.com/xxx/yyy.git 这种裸地址,因为 composer 默认走匿名 HTTPS,而私有库需要鉴权。必须显式声明为 vcs 类型,并确保 URL 是可被 git 命令克隆的格式。
常见错误是直接填网页地址(比如 https://gitee.com/your-org/private-package),结果报错:Could not fetch https://gitee.com/your-org/private-package, enter your gitee.com credentials —— 其实不是让你输密码,而是配置没对。
- 在
composer.json的repositories数组里加一条:
{
"type": "vcs",
"url": "https://oauth2:YOUR_TOKEN@gitee.com/your-org/private-package.git"
}
-
YOUR_TOKEN是你在 gitee「个人设置 → 私人令牌」生成的,权限至少勾选projects - URL 必须以
.git结尾,否则 git clone 会失败 - 不要用
ssh://地址(如git@gitee.com:xxx/yyy.git),除非你本地已配好 ssh key 且 composer 能透传,否则容易卡在认证环节
为什么 require 时提示 “could not find package”
不是包名写错了,大概率是 composer.json 里 name 字段和你 require 的名字不一致,或者没推 tag。
gitee 上的私有包,composer 只认带语义化版本 tag 的提交(比如 v1.0.0、1.2.3),不认分支名(dev-master 默认不可用,除非显式启用)。
- 确认你的私有包根目录
composer.json里写了正确的name,格式是vendor/name(例如myorg/utils) - 运行
git tag v1.0.0 && git push --tags,确保 tag 已推到 gitee - 如果只想临时测试,可以在 require 时指定分支:
"myorg/utils": "dev-main",但必须在根项目composer.json加上"minimum-stability": "dev"和"prefer-stable": false
如何避免每次都要输 token 或暴露凭证
把 token 写死在 composer.json 里是危险的,尤其当代码进 Git 仓库;用 auth.json 是标准解法,但要注意路径和权限。
- 在项目根目录建
auth.json,内容为:
{
"http-basic": {
"gitee.com": {
"username": "oauth2",
"password": "YOUR_TOKEN"
}
}
}
- 这个文件必须放在
COMPOSER_HOME目录(全局)或项目根目录(当前项目生效) - Linux/macOS 下记得
chmod 600 auth.json,否则 composer 会拒绝读取 - 如果用了
composer config --global配置过全局 auth,优先级高于项目级auth.json,容易覆盖出错
gitee Webhook 自动更新依赖时的坑
想在 gitee 推 tag 后自动 composer update?别直接在 hook 脚本里跑 composer install —— 它默认跳过 dev 包,而且没加载项目级 auth.json。
- hook 脚本中执行
composer install --no-interaction --no-progress前,先cd /path/to/project,确保上下文正确 - Webhook 运行用户(如 www-data)可能没权限读取
auth.json,建议改用全局auth.json并设好权限 - gitee 的 webhook POST body 不含 tag 名,得靠解析 payload,不能假设
composer update vendor/package就能触发更新
私有包的版本解析和缓存行为比公开包更敏感,tag 推错一次,本地 composer.lock 可能记下错误哈希,删 vendor 和 composer.lock 再重装是最稳妥的清理方式。










