post-autoload-dump是最贴近“装完就提醒”的钩子,它在composer require/update/install后自动加载器重建时触发,可配合脚本检测包是否存在并用fprintf(stderr)输出提示,避免ci吞掉输出且不依赖不可靠环境变量。

Composer 原生不支持在 require 或 install 过程中为某个包“自动弹出定制化提示”,所谓“安装成功后显示一行说明”必须靠脚本钩子 + 条件判断来模拟,且容易重复触发或被 CI 环境吞掉输出。
post-autoload-dump 是最贴近“装完就提醒”的钩子
它在每次自动加载器重建后执行,包括 composer require、composer update 和 composer install 后,比 post-install-cmd 更及时、更贴近单个包的安装场景。
- 把提示逻辑写成一个独立 PHP 脚本(比如
scripts/notify-my-package.php),内容类似:<?php if (file_exists('vendor/acme/my-package')) { fprintf(STDERR, "\n? acme/my-package 已安装,建议运行: php artisan vendor:publish --tag=my-package-config\n"); } - 在项目根目录的
composer.json中注册:"scripts": { "post-autoload-dump": [ "php scripts/notify-my-package.php" ] } - ⚠️ 不要直接用
echo—— CI 环境常静默stdout,fprintf(STDERR, ...)才能确保可见 - 如果提示重复刷屏,可在脚本里加文件标记(如
.acme-my-package-notified)并先检查是否存在
为什么不用 post-install-cmd?
post-install-cmd 在整个 install 流程末尾执行,但它无法区分“这次是否真的装了你的包”。比如用户只改了 composer.lock 并重跑 install,你的提示又会出来——而实际什么都没新增。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 它适合项目级初始化提示(如“请配置 .env”),不适合包级安装反馈
- 想精准判断某包是否首次安装?得手动查:
composer show --format=json acme/my-package 2>/dev/null或检测vendor/acme/my-package目录是否新建 - 别依赖
getenv('COMPOSER_COMMAND')判断命令类型——这个环境变量不可靠,Composer 不保证设置
自定义 Installer 插件里不能直接 echo 提示
Installer 的 install() 方法是底层文件操作阶段,此时自动加载器尚未重建,IOInterface 实例也未传入上下文;强行 echo 或 fprintf 可能被截断、无序,甚至破坏进度条渲染。
- Installer 的职责是路径计算与文件搬运,不是用户交互。提示应交给上层钩子(如
post-autoload-dump)处理 - 如果你在
supports()或getInstallPath()里加$io->write(),它可能在composer validate或diagnose时意外触发,造成干扰 - 真要在 Installer 中留痕,仅限调试:用
$io->writeError()+-v参数,且必须加条件(如仅当in_array('my-package', $argv))
最易被忽略的一点:所有钩子脚本的执行路径都是项目根目录,但 vendor/ 位置可能被 config.vendor-dir 修改过。硬编码 vendor/acme/my-package 会失效,正确做法是读取 composer config vendor-dir 输出或用 $composer->getConfig()->get('vendor-dir')(在 Plugin 中)动态拼接。










