Composer没有内置publish命令,所谓“发布”实为通过scripts调用git tag、git push及Packagist webhook实现;2FA仅影响git推送,需用PAT或SSH替代密码,且须确保Packagist webhook配置正确并验证邮箱。

为什么直接用 composer publish 会失败
因为 composer publish 根本不存在——Composer 没有内置发布命令。所谓“自动化发布”,本质是靠 scripts 字段调用 git tag、git push 和 Packagist webhook 触发同步。双因子认证(2FA)只影响 Git 推送环节,不影响 Composer 本身,但很多人卡在这里:本地 git push 失败,误以为是 Composer 配置问题。
Git 推送被 2FA 拒绝时怎么绕过
GitHub/GitLab 启用 2FA 后,密码登录会被拒绝,必须换用 Personal Access Token(PAT)或 SSH 密钥。HTTP 方式推送必须用 PAT 替代密码:
- 生成 PAT 时勾选
repo权限(GitHub)或write_repository(GitLab) - 把远程 URL 改成
https://<token>@github.com/yourorg/your-package.git - 脚本里避免硬编码 token,改用环境变量:
git push https://${GITHUB_TOKEN}@github.com/yourorg/your-package.git v1.0.0 - SSH 更安全:确保
~/.ssh/id_rsa.pub已添加到 GitHub 账户,且远程 URL 是git@github.com:yourorg/your-package.git
别用 git config --global credential.helper store 存密码——2FA 下无效,且 token 明文落盘风险高。
post-release 脚本里怎么安全传 token
在 composer.json 的 scripts 中调用 git push 时,不能把 token 写死。正确做法是:
- CI 环境(如 GitHub Actions)用
${{ secrets.GITHUB_TOKEN }}注入,本地用export GITHUB_TOKEN=xxx "post-release": "git push origin --tags || git push https://${GITHUB_TOKEN}@github.com/yourorg/your-package.git --tags"- 加
||是为了 fallback:SSH 失败时自动切 HTTP+token - 务必在脚本开头加
test -n \"$GITHUB_TOKEN\" || { echo \"GITHUB_TOKEN missing\"; exit 1; },防静默失败
Packagist 同步失败的典型表现和检查点
打了 tag、push 成功,但 composer require your/package 报 Could not find package,大概率是 Packagist 没收到通知。检查顺序必须是:
- 确认 GitHub webhook 的 Payload URL 是
https://packagist.org/api/github(不是镜像站地址) - 查看 webhook 最近一次 delivery 状态:401 表示 Packagist 账户邮箱未验证;404 表示仓库未在 Packagist 提交过
- 手动点 Packagist 包页右上角
Update,看是否能拉到新 tag——能拉说明 webhook 配错了,不能拉说明仓库根本没提交或composer.json不合法 - 用
composer validate本地跑一遍,name格式错、autoload缺结尾斜杠、psr-4命名空间末尾少\,都会导致 Packagist 拒收
双因子本身不改变 Packagist 流程,但它让 Git 推送这一步变得不可跳过且容错更低——token 过期、权限不足、URL 拼错,任何一个细节漏掉,整个发布链就断在第一步。


















