私有仓库的读写权限由git服务器(如github/gitlab)或私有composer仓库服务(如satis、private packagist)控制,composer仅负责拉取代码;auth.json或composer_auth只决定读权限,写权限需对应凭证具备write:packages、write_repository等明确授权,且须通过凭证隔离实现不同环境差异化权限。

私有仓库的读写权限由谁控制?
Composer 本身不管理读写权限,它只负责“拉代码”;真正的读写控制在 Git 服务器(如 GitLab/GitHub)或私有 Composer 仓库服务(如 Satis、Private Packagist)层面。你配置的 auth.json 或 COMPOSER_AUTH 只决定“能不能读”,而“能不能推 tag、改 composer.json、发布新版本”完全取决于你用的凭证是否具备对应 Git 权限。
常见误区是以为配了 http-basic 就能 push —— 实际上,http-basic 凭据默认只有 read 权限。要写,必须确保:GitHub PAT 至少含 write:packages 和 delete:packages;GitLab Token 必须勾选 api + write_repository;Satis 部署侧需额外配置 Webhook 或 CI 触发重建逻辑。
怎么让不同人/环境拥有不同权限?
靠凭证隔离,不是靠 Composer 配置。同一个项目里,auth.json 是静态文件,没法按用户动态切换;真正可行的方式是:
- 开发机用个人 PAT,权限开到
repo(可读写私有库)+read:packages - CI 环境用专用 deploy token,只给
read:packages,禁止写操作 - 打包镜像时用
COMPOSER_AUTH注入,避免挂载auth.json文件(挂载失败会导致静默认证失败) - 团队协作中,
auth.json永远不进 Git —— 它只存在于本地或 CI secret 中
vcs 类型下,“写权限”到底影响什么?
对 Composer 的日常使用来说,“写权限”几乎只影响三件事:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 能否在私有 Git 仓库打 tag:
git tag v1.0.0 && git push --tags—— 没写权限就无法发布稳定版本,require里写"^1.0"会直接报错 - 能否修改私有包的
composer.json并 push,否则别人composer update时看到的元信息(如 autoload、require-dev)不会更新 - 能否用
composer publish(非官方命令)或自定义脚本触发 Satis rebuild —— 这步需要 HTTP POST 权限或 SSH 访问构建机
注意:composer install 和 composer update 永远只需要读权限;写权限缺失时,错误通常表现为 Git 报 remote: Permission denied,而不是 Composer 自身报错。
为什么 auth.json 权限设成 600 还是没生效?
因为 Composer 查 auth.json 有严格路径优先级和格式校验:
- 它先找项目根目录下的
./auth.json,再找$COMPOSER_HOME/auth.json(通常是~/.composer/auth.json),最后 fallback 到系统默认路径 - 如果项目级
auth.json权限是 600,但内容里混用了github-oauth和http-basic在同一层对象下(比如都塞进外层{}),Composer 会静默忽略整个文件 - GitLab 域名必须一字不差:
"http-basic": {"gitlab.example.com": {...}},写成"https://gitlab.example.com"或"gitlab.example.com:443"都不匹配 - Windows 用户要注意:记事本保存的
auth.json可能带 BOM 头,导致 JSON 解析失败且无提示
最稳的验证方式是运行 composer diagnose,它会明确告诉你 “Auth config is valid” 还是 “Auth config file not found or invalid”。










