post-update-cmd 不会自动检测 git 分支变动,仅在显式执行 composer update 后触发;要实现远程 dev 分支更新后自动测试,需借助 git hooks、ci 配置(如 github actions)或 webhook 服务,而非依赖 composer 自身事件机制。

Composer 本身不支持自动检测 Git 分支变动,更不会主动监听远程仓库更新。所谓“自动检测开发版分支并触发测试”,必须靠外部工具链组合实现,核心是把「分支变更」事件翻译成可执行命令。
post-update-cmd 不会在 dev 分支更新时自动触发
很多人误以为只要 composer update 一次,之后远程 dev 分支有新提交,本地 post-update-cmd 就会跟着跑——这是错的。post-update-cmd 只在你显式执行 composer update 后运行,它不感知 Git 状态,也不轮询远程。即使你用 composer require vendor/pkg:dev-main 锁的是开发分支,Composer 仍只在你手动运行 update 时才拉取最新 commit 并触发钩子。
- 开发分支(如
dev-main)被当作一个“版本约束”,不是实时通道 -
composer update默认仍受composer.lock约束;若 lock 文件里已记录某个 dev 分支的 commit hash,不加--with-dependencies或删 lock 就不会更新 -
post-update-cmd触发时机与 Git remote 是否有新 push 完全无关
真正可行的“检测 + 测试”闭环:Git hook + Composer script
想做到“远程 dev 分支一推送,就跑局部测试”,得在代码仓库层面埋点,而不是依赖 Composer 自身。最轻量、可落地的方式是利用 git hooks(推荐 post-merge 或 post-checkout)结合 Composer 脚本:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 在
.git/hooks/post-merge中写 shell 判断当前分支是否为dev类分支:if git rev-parse --abbrev-ref HEAD | grep -qE '^(dev|develop|main)$'; then composer run test:unit; fi -
test:unit是你在composer.json的scripts里定义的命令,例如:"test:unit": "phpunit --testsuite=unit" - 注意:hook 脚本需加可执行权限(
chmod +x .git/hooks/post-merge),且仅对本地操作生效;CI 场景下应改用 CI 配置(如 GitHub Actions 的on: push: branches: [dev])
CI 中如何让 dev 分支更新真正触发测试?别依赖 post-install-cmd
CI 流水线里常见陷阱:每次 clone 后跑 composer install,但 post-install-cmd 却没执行。原因很实际:
-
post-install-cmd仅在vendor/不完整或composer.lock变更时触发;CI 缓存复用vendor/目录 → 它直接跳过 - 加了
--no-dev(CI 默认行为)→ 所有开发期脚本(含post-install-cmd)被禁用,哪怕你在 scripts 里写了也不会跑 - 正确做法是显式调用:
composer run test:unit --no-interaction,而不是指望生命周期钩子自动发生
想监听远程分支变化?只能靠轮询或 webhook
如果真要“自动检测远程 dev 分支有没有新 commit”,就得跳出 Composer 生态:
- 方案 A(简单轮询):用 cron 每 5 分钟跑一次
git ls-remote origin dev | cut -f1,比对上次记录的 hash,变了就git pull && composer run test:unit - 方案 B(推荐):GitHub/GitLab 提供 webhook,push 到
dev分支时 POST 到你自己的轻量 endpoint(比如一个 PHP CLI 脚本),该脚本做git pull && composer run test:unit - 无论哪种,都和 Composer 的
scripts机制无关——它只负责提供可执行命令,不负责事件感知
最容易被忽略的一点:所谓“局部测试”,必须明确界定范围。用 phpunit --filter 或 --group 控制粒度,否则每次 dev 分支更新都全量跑测试,CI 时间和资源消耗会迅速失控。










