composer事件触发依赖scripts键的精确命名与命令流程:post-install-cmd仅在首次install或lock未命中时执行,post-update-cmd在update或require时触发,post-autoload-dump最稳定,只要autoload.php被重写即运行。

Composer 的事件触发不是靠“设置开关”或“启用配置”,而是由命令执行流程 + composer.json 中精确命名的 scripts 键共同决定的。写错名字、放错位置、依赖错误时机,脚本就根本不会跑——不是被禁用,是压根没被识别。
post-install-cmd 和 post-update-cmd 到底什么时候执行
这两个钩子名字像兄弟,但行为完全不对等:
-
post-install-cmd只在composer install且当前没有vendor/或composer.lock未命中缓存时才触发;composer install重跑(lock 没变)时它静默跳过 -
post-update-cmd在composer update或composer install --with-dependencies时执行;日常开发中加包(composer require foo/bar)走的是 update 流程,所以它更常被触发 - 想覆盖“所有依赖变更后都要做的事”,得同时定义两者,或直接改用
post-autoload-dump(它只要 autoload 文件被重写就触发)
post-autoload-dump 是最稳的“依赖变更后”钩子
它不关心你是 install 还是 update,只盯 vendor/autoload.php 是否被实际写入。只要类加载映射变了,它就跑,而且每次必跑(除非加了 --no-scripts)。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 触发场景包括:
composer install、composer update、composer dump-autoload、甚至修改autoload配置后再次 install/update - 适合做:清理框架缓存、生成代理类、扫描注解、检查 class 存在性——因为此时
vendor/autoload.php已可 require,类已能反射 - 注意:如果
vendor/和autoload.php都没变(比如只改了 README),它也不会触发;这不是 bug,是设计使然
post-package-install 根本不是你想要的“单个包安装后”
别被名字骗了。post-package-install 是实验性钩子,官方明确标注“不建议依赖”,且它只在 install/update 整体结束时调用一次,不带具体包信息。
- 你在
composer.json里配了"post-package-install": "echo 'done'",但装完 monolog 后没输出?正常——它根本不按包触发 -
$event->getOperation()在多数情况下返回null或不可靠类型;无法稳定拿到刚装的包名、版本、源路径 - 真要对某个包做安装后处理(比如 laravel/framework 装完自动生成 config),必须写 Composer 插件,监听
Composer\Installer\InstallerEvents::POST_PACKAGE_INSTALL事件,并在activate()里手动addListener('post-package-install', ...)
手动运行脚本 ≠ 触发事件,别混淆 run-script 和 hooks
composer run-script xxx 就是直接执行命令,和事件生命周期无关。它不模拟 install、不重建 autoload、也不触发任何其他钩子。
- 如果你定义了
"scripts": { "build": "php build.php" },那composer run-script build就是立刻跑build.php,仅此而已 - 不要指望用
run-script post-install-cmd来“手动触发安装后逻辑”——它只是执行同名脚本,不会补全 Composer 内部上下文(比如$event对象为空) - 调试钩子是否生效?删掉
vendor/和composer.lock,再跑composer install;或者加echo到脚本开头,看终端有没有输出
最易忽略的一点:所有事件钩子都依赖 composer.json 里 scripts 键的拼写完全准确——post-install、after-install、postInstallCmd 全都不行,只有 post-install-cmd 这种带 -cmd 后缀的才被识别。大小写、连字符、空格,差一个字符,就等于没写。










