pre-install-cmd 在 composer 2.2+ 中已被彻底删除,静默忽略不报错;唯一合法替代是 pre-install(无-cmd后缀),在依赖解析完成、lock校验通过后触发,但 vendor 尚未写入。

pre-install-cmd 在 Composer 2.2+ 中已完全不存在,不是配置错,是它被官方彻底删除了。你写进 composer.json 的 "pre-install-cmd" 字段会被静默忽略——不报错、不警告、不执行。
如果你正卡在这一步,先停一下:别再查“如何配置 pre-install-cmd”,它不是失效,是压根没这东西了。
Composer 2.2+ 真实可用的“安装前”事件只有 pre-install
pre-install(注意:没有 -cmd 后缀)是 pre-install-cmd 的唯一合法替代,自 Composer 2.2.0(2021 年底)起生效。
- 它在依赖解析完成、
composer.lock校验通过后触发,但所有包都还没下载、vendor 目录尚未写入 - 支持 shell 命令和 PHP 回调,例如:
"pre-install": ["echo 'checking env...'", "MyBuild::beforeInstall"]
- 无法 require
vendor/autoload.php—— 此时vendor/可能为空或不完整 - 若你依赖某个包提供的 CLI 工具(如
phpstan),此时它根本不在PATH中,调用必失败
常见误配:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
"pre-install-cmd"→ 静默跳过 -
"preInstall"/"on-pre-install"→ 不识别、不执行 -
"pre-autoload-dump"→ 虽然能用,但它发生在依赖已下载解压之后,不是“安装前”语义
pre-autoload-dump 是唯一能稳定运行的“近似安装前”钩子
如果你的任务是生成 stub、清理旧缓存、检查 .env 文件是否存在,且逻辑不依赖已安装的第三方类,pre-autoload-dump 反而是更可靠的选择。
- 它在
vendor/写入完成、但vendor/autoload.php尚未生成时触发 - 你可以安全执行
php scripts/check-env.php,只要这个脚本不 require 第三方类 - 它同时适用于
composer install和composer update - 注意:不要在其中调用
composer dump-autoload,否则会递归触发,导致死循环
典型适用场景:
- 备份/生成
.env文件(if (!file_exists('.env')) { copy('.env.example', '.env'); }) - 清理
bootstrap/cache/或storage/framework/cache/ - 执行纯 PHP 的环境检测(PHP 版本、扩展、文件权限)
为什么你写的 pre-install-cmd 看似“有时有效”?
那大概率是因为:
- 你实际用的是 Composer 1.x(2021 年前的老项目),它确实支持
pre-install-cmd - 你误把
post-install-cmd当成前置用了(它在安装后执行,但输出日志容易让人误判时机) - 你启用了第三方插件(如
composer-asset-plugin),它自行注册了同名钩子,与 Composer 原生无关
验证方式很简单:
运行 composer --version,若输出 Composer version 2.2.0 或更高,就请立刻删掉 pre-install-cmd 字段,改用 pre-install 或 pre-autoload-dump。
真正容易被忽略的点是:Composer 不会告诉你钩子名错了。它只是沉默地跳过——而开发者往往花半天调试脚本逻辑,却没意识到钩子名本身就不被识别。










