真正可用、可依赖的前置时机只有 pre-autoload-dump 和手动封装脚本;pre-autoload-dump 在 autoload 文件生成前触发,vendor 已解包、lock 已解析,适合环境检查但不可用项目类。

想在 composer install 或 composer update 开始前做环境检查、配置校验或权限确认?别用 pre-install-cmd —— 它在 Composer 2.2+ 已被弃用,且行为不稳定;真正可用、可依赖的前置时机只有 pre-autoload-dump 和手动封装脚本。
pre-autoload-dump 是唯一可靠的“安装前”钩子
这个事件在 autoload 文件生成之前触发,但此时 vendor/ 已解包完成、composer.lock 已解析完毕,属于依赖流程中“所有包就位、但自动加载器尚未激活”的临界点。它不被弃用,不看 lock 是否变化,每次 install/update 都执行。
- 适合做:检查
.env是否存在、验证 PHP 扩展是否启用、生成 stub 文件、清理旧缓存目录 - 不适合做:调用项目内任何未显式 require 的类(
vendor/autoload.php还没加载) - 不能做:
composer dump-autoload自身调用,否则会递归触发 - 回调参数是
AutoloadDumpEvent,可通过$event->getDumpDirectory()拿到目标路径
pre-install-cmd 已失效,别再写进 scripts
官方文档明确标记 pre-install-cmd 和 pre-update-cmd 为 deprecated,Composer 2.2+ 不再保证其执行,部分版本直接跳过。你写了它,CI 可能不报错也不执行,本地又偶然跑通,极难排查。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 现象:加了
"pre-install-cmd": "echo 'checking...'",但composer install输出里完全没这行 - 原因:不是配置错,是 Composer 主动忽略该事件名
- 替代方案:把检查逻辑挪到
pre-autoload-dump,或改用独立 shell 脚本 + Makefile / npm run 封装 - 若必须拦截命令入口,建议在 CI 流程中提前运行检查脚本,而非依赖 Composer 事件
如何让前置检查脚本既可靠又可调试
别把逻辑塞进一行命令,也别指望 vendor/autoload.php 自动可用。最稳的方式是用 php -f 调用一个独立 PHP 文件,并在其中显式加载必要依赖。
- 在
composer.json中写:"pre-autoload-dump": ["php -f build/check-env.php"] -
build/check-env.php开头需手动require __DIR__.'/../vendor/autoload.php';(如果要用项目类) - 若只做基础检查(如
extension_loaded('mbstring')),可不加载 autoloader,减少失败面 - 脚本末尾用
exit(1)中断流程,Composer 会捕获非零退出码并停止后续操作 - 加日志:用
file_put_contents('php://stderr', "[check] ...\n");确保输出不被缓冲
为什么你不该在脚本里尝试获取 Composer 实例
绝大多数 scripts 类型的回调(包括 pre-autoload-dump)根本收不到 Composer\Composer 对象。它只在插件监听的特定 PackageEvent 或 CommandEvent 中通过 $event->getComposer() 暴露,而 scripts 是独立进程启动的。
- 错误写法:
function handle($event) { $composer = $event->getComposer(); ... }——$event是Event基类,没这个方法 - 正确做法:真需要读
composer.json或依赖图,老老实实json_decode(file_get_contents('composer.json'), true) - 若必须用完整 Composer 实例,走
Composer\Factory::create(new NullIO(), getcwd()),但注意它会重新解析 lock 文件,有性能开销
真正关键的不是“有没有前置事件”,而是“检查逻辑是否与 Composer 执行阶段对齐”。pre-autoload-dump 看似靠后,实则是目前唯一稳定、可控、不被弃用的前置窗口——只是得接受它不加载 autoloader 这个事实。










