pre-install-cmd 在 composer 2.2+ 中已被彻底移除,应改用 pre-install 事件(无 -cmd 后缀),它在依赖解析完成后、下载前触发,支持 shell 命令和 php 回调,但无法访问 vendor/autoload.php。

pre-install-cmd 在 Composer 2.2+ 中已被移除,直接写这个钩子会静默失效——不是配置错,是它根本不存在了。
pre-install-cmd 已被废弃,别再查文档硬配
Composer 官方在 v2.2.0(2021 年底)起彻底删除了 pre-install-cmd 和 post-install-cmd 这两个脚本钩子。如果你在 composer.json 里写了它们,Composer 会完全忽略,不报错、不提示、不执行。
- 实际生效的只有
pre-install-cmd的替代方案:pre-install-cmd→ 改用pre-install-cmd?不对,是根本没这东西了 - 正确路径是迁移到标准事件:用
pre-install-cmd对应的是pre-install-cmd?不,是pre-install(无 -cmd 后缀) - 所有带
-cmd后缀的钩子(如pre-update-cmd)都已废弃,统一归入scripts下的标准事件名
该用哪个 script 事件来替代 pre-install-cmd
想在 composer install 开始拉包前执行逻辑,唯一可用的是 pre-install 事件(注意:没有 -cmd)。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
- 它在依赖解析完成、但尚未下载任何包时触发
- 支持 shell 命令和 PHP 回调,例如:
"pre-install": ["echo 'installing...'", "MyScript::beforeInstall"] - 与旧
pre-install-cmd不同,pre-install不会自动继承scripts目录下的命令;必须显式声明或使用完整路径 - 若你依赖某个包里的 CLI 工具(比如
phpstan),别指望pre-install能调用它——此时那些包还没装,PATH 里没有
常见误配和报错场景
很多人卡在“写了没反应”,本质是混淆了版本行为或事件名:
- Composer 1.x 可用
pre-install-cmd,但升级到 2.x 后立即失效 —— 检查版本:composer --version - 写成
"pre-install-cmd": "php check-env.php"→ 静默跳过,不报错也不执行 - 写成
"pre-install": "php check-env.php"→ 正确,但要注意:如果check-env.php依赖未安装的库,会因 autoloader 未生成而 fatal error - 在
pre-install里执行composer dump-autoload是无效的——autoload 还没生成,dump 也没意义
真正安全的 pre-install 替代方案
如果目标是校验环境、检查配置或阻断非法安装,推荐组合使用:
- 把轻量级检查(PHP 版本、扩展、环境变量)放在
pre-install,用纯 PHP 或系统命令,不依赖 vendor - 把需要已安装依赖的逻辑(如运行某工具预检)挪到
post-install-cmd(仍可用)或post-install(推荐) - 更稳妥的做法:写个独立 wrapper 脚本,先跑检查,再调
composer install,绕过事件机制本身 - 示例片段:
"pre-install": ["php -r \"if (!extension_loaded('mbstring')) { exit(1); }\""]
最常被忽略的一点:pre-install 事件无法访问 vendor/autoload.php,哪怕你之前 run 过 install —— 每次 install 都是全新上下文。










