Composer install 时可通过 composer.json 的 scripts 字段注册 pre-install-cmd 和 post-install-cmd 钩子自动执行自定义脚本,支持 PHP 方法、命令行或内联 PHP;PHP 类方法需为 public static、类被 autoload-dev 正确加载,且方法签名含 $event 参数;post-install-cmd 在 vendor/autoload.php 生成后运行,但仅限完整安装,否则应改用 post-autoload-dump;多脚本按数组顺序执行,内置脚本总在用户脚本之后。

Composer install 时怎么自动执行自定义脚本?
Composer 支持在 install 和 update 过程中触发自定义脚本,关键不是写个 shell 脚本然后手动调用,而是把逻辑注册进 composer.json 的 scripts 字段,并指定对应事件钩子。
最常用的是 pre-install-cmd 和 post-install-cmd —— 它们会在 composer install 执行前后被自动调用。注意:这些钩子只在显式运行 install 时触发,update 不会走它们(要用 pre-update-cmd / post-update-cmd)。
-
pre-install-cmd在依赖解析完成、但尚未下载/安装包前运行 -
post-install-cmd在所有包安装完毕、vendor/autoload.php已生成后运行 - 脚本可以是 PHP 函数(如
"MyScript::beforeInstall")、命令行指令(如"npm install"),或内联 PHP 代码(用@php开头)
PHP 类方法作为脚本怎么写才不报错?
用类方法当脚本时,必须确保类已加载、方法存在且是静态的;否则 Composer 会抛出 Class not found 或 Call to undefined method 错误。推荐做法是把脚本类放在 autoload-dev 的 psr-4 或 classmap 下,确保 Composer 能自动加载它。
示例:MyScript 类需定义在 src/Scripts/MyScript.php,并在 composer.json 中声明:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
{
"autoload-dev": {
"psr-4": {
"Scripts\": "src/Scripts/"
}
},
"scripts": {
"pre-install-cmd": [
"Scripts\MyScript::beforeInstall"
],
"post-install-cmd": [
"Scripts\MyScript::afterInstall"
]
}
}
- 方法必须是
public static - 参数列表要匹配 Composer 调用约定:第一个参数是
$event(ComposerScriptEvent实例),可用于获取运行模式、IO 对象等 - 不要在方法里直接
exit()或die(),应抛出异常来中断流程
为什么 post-install-cmd 里 vendor/autoload.php 还没生成?
这不是 bug,而是 Composer 的执行顺序问题:post-install-cmd 确实发生在所有包解压和 vendor/autoload.php 生成之后——但前提是本次 install 是“完整安装”(即没有 vendor 目录)。如果 vendor 已存在且 composer.lock 未变,Composer 可能跳过 autoload 重建,导致你的脚本读不到刚生成的 autoload.php。
- 检查是否真触发了 autoload 重建:运行
composer install --verbose,看输出里有没有Generating autoload files - 若需稳定访问 autoloader,改用
post-autoload-dump钩子,它专为 autoload 文件生成后设计 - 避免在
post-install-cmd中依赖vendor/autoload.php的绝对路径;可用$event->getComposer()->getConfig()->get('vendor-dir')动态获取
多个脚本按什么顺序执行?能控制先后吗?
同一事件下的多个脚本按 composer.json 中数组顺序执行,但要注意:内置脚本(比如 Composer 自己的 autoload 生成)永远在用户脚本之后运行,无法前置。
- 如果想让某个脚本最先执行,把它放在数组开头;想最后执行,放数组末尾
- 不同事件之间有固定顺序:
pre-install-cmd→ 安装过程 →post-install-cmd→post-autoload-dump - 跨事件依赖要小心:比如
post-install-cmd里调用的命令依赖vendor/bin下的二进制,而该二进制由某个包提供——那它一定已在post-install-cmd时可用;但若在pre-install-cmd里调用,大概率失败
真正容易被忽略的是钩子的触发边界:install 和 update 共享大部分钩子,但 dump-autoload 单独触发 post-autoload-dump,而 require 命令会触发 pre-require-cmd 和 post-require-cmd —— 这些细节不查文档很容易踩空。

















