Composer 无自动发布能力,持续发布需通过 composer.json 的 scripts 字段串联本地命令、Git 操作与 Packagist 同步;漏推 tag 或 webhook 配错将导致下游无法拉取新版本。

Composer 本身没有“自动发布”能力,所谓持续发布,是靠 composer.json 的 scripts 字段串联本地命令、Git 操作和 Packagist 同步完成的;漏掉 git push origin v1.0.0 或 Packagist webhook 配置失败,下游就永远 composer require 不到新版本。
composer.json 里 scripts 怎么配 release 流程
所有自定义脚本(如 pre-release、release、post-release)都必须手动触发,不会在 composer update 或其他事件中自动运行。官方只定义了十几个自动钩子(如 post-install-cmd),pre-release 不在其列。
-
pre-release应该做composer validate --strict和静态分析,提前暴露name格式错误或autoload路径错位 -
release推荐调用 PHP 脚本(如@php ./bin/release.php),处理版本号递增、composer.json写入、生成 CHANGELOG 等交互逻辑 -
post-release必须包含git push origin --tags,只写git push会漏掉 tag;若脚本含readline提问,CI 中要加--no-interaction或用环境变量传版本号
git tag 必须推送到远程且格式为 v1.0.0
Packagist 完全忽略 composer.json 中的 version 字段,只认 Git tag 名。不带 v 前缀(如 1.0.0)、大写 V(如 V1.0.0)、或带后缀(如 v1.0.0-beta)都不算 stable 版本,用户执行 composer require vendor/name:^1.0 会报 Could not find package。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
- 正确打标命令:
git tag -a v1.0.0 -m "release v1.0.0" - 必须显式推送:
git push origin v1.0.0(不要只用git push --tags,它可能漏推某个 tag) - tag 对应的 commit 必须已包含合法
composer.json,否则 Packagist 抓取时校验失败
Packagist webhook 配错了等于没配
2023 年底起 Packagist 彻底关闭自动发现,首次提交后所有后续更新都依赖 GitHub webhook 触发。没配或配错,就会出现“刚推了 v2.0.0,但页面 Last updated 时间不变”的情况,只能手动点包页右上角 Update 补救。
- Payload URL 必须是
https://packagist.org/api/github(不是 php.cn 等镜像地址) - Events 推荐勾选
Just the push event,它能捕获 tag 推送;别选Everything,容易因 payload 过大触发失败 - 配置完去 GitHub Webhooks →
Recent Deliveries查状态码,只有200才算通
CI/CD 中用 composer run release 而不是隐式触发
CI 流水线里不要依赖任何“自动”行为,统一用 composer run release 作为发布入口。它把整个流程收束为一个可审计、可重放的操作,避免因分支名变更(如从 main 改成 master)或钩子误配导致发布中断。
- 脚本内涉及 Git 操作(如
git commit、git tag)时,确保 CI runner 有写权限(GitHub Actions 需permissions: contents: write) - 如果用 PHP 脚本生成版本号,注意
composer.json中的version字段会被 Packagist 忽略——它只看 tag 名,写进去反而干扰人工判断 - 每次修改
autoload或name,都必须去 Packagist 后台点Update手动刷新,不能等 webhook 自动抓取
最容易被跳过的其实是 Packagist 的同步机制:它不重试、不告警、一次 webhook 失败就静默卡住,Last updated 时间停在三天前,而你还在等下游 require 成功。

















