自定义事件命令必须配置在 composer.json 的 "scripts" 字段中,key 为 composer 官方生命周期钩子(如 "post-autoload-dump"),value 为字符串或数组形式的命令;其他位置声明无效。

Composer 自定义事件触发命令在哪配置
自定义事件命令必须写在 composer.json 的 "scripts" 字段里,不是插件或外部脚本。Composer 只认这个位置声明的脚本,其他地方写的不会被监听或执行。
常见错误是把命令写在 scripts 外(比如直接丢进 extra 或根级),结果事件一触发就静默失败——根本没注册上。
-
"scripts"是一个对象,key 是事件名(如"post-install-cmd"),value 是要执行的命令(字符串或字符串数组) - 支持的事件名必须是 Composer 官方定义的生命周期钩子,比如
"pre-autoload-dump"、"post-update-cmd",拼错或自造名字不会触发 - 命令可以是 PHP 函数调用(如
"MyClass::myMethod")、shell 命令(如"php artisan optimize:clear"),或带参数的 CLI 工具
哪些事件名能用,什么时候触发
事件名不是随便起的,得对应 Composer 内部明确的执行时机。比如 "post-autoload-dump" 在生成自动加载文件后触发,而 "pre-install-cmd" 在 composer install 开始前运行——顺序错了,依赖可能还没装好就去读类,直接报 Class not found。
容易混淆的是 "post-install-cmd" 和 "post-update-cmd":前者只在首次 install 时触发(且 vendor/ 为空时),后者在 update 或带 --with-all-dependencies 的 install 中才跑。很多项目误用前者做“每次安装后清理缓存”,结果 CI 环境反复部署时根本没执行。
- 调试技巧:加
"echo 'triggered post-update-cmd'"到脚本里,配合composer update -v看输出确认是否命中 - 常用可靠事件:优先选
"post-autoload-dump"(只要 autoloader 重生成就触发,install/update 都覆盖),比依赖命令类型更稳定 - 注意
"pre-package-install"这类包粒度事件,参数里会传入包信息,但需用$event->getOperation()->getPackage()在 PHP 方法里取,shell 命令拿不到上下文
PHP 回调函数怎么写才不报错
写 "MyClass::myMethod" 形式回调时,最常踩的坑是类没被自动加载、方法不存在、或签名不对。Composer 调用时会传一个 CommandEvent 实例进去,如果方法声明没写参数,PHP 7.1+ 会 strict warning 报错并中断后续脚本。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
示例正确写法:
{
"scripts": {
"post-autoload-dump": [
"MyBuild\Script::buildAssets"
]
}
}
MyBuildScript::buildAssets 必须是 public static 方法,且接受一个 CommandEvent 参数:
namespace MyBuild;
use ComposerScriptEvent;
class Script
{
public static function buildAssets(Event $event)
{
// 注意:这里不能直接 echo,要通过 $event->getIO()->write()
$event->getIO()->write('Building assets...');
exec('npm run build');
}
}
- 类文件路径必须被
composer.json的"autoload"覆盖,否则Class 'MyBuildScript' not found - 方法必须是
static,非静态方法会抛Non-static method should not be called statically - 不要在回调里 exit() 或 die(),会中断整个 Composer 流程,导致依赖安装卡住
命令执行失败却不报错?检查退出码和 --no-scripts
脚本执行失败但 Composer 没提示,大概率是命令本身返回了 0 退出码(比如 shell 里忘了加 set -e,或 PHP 脚本末尾没 exit(1))。Composer 默认只看子进程退出码,0=成功,非0=失败并中止。
另一个隐蔽原因是用了 composer install --no-scripts(Laravel Valet 或某些 CI 模板默认加),所有 scripts 直接跳过,连日志都不会打。
- 本地测试务必去掉
--no-scripts,CI 中检查 pipeline 脚本是否意外加了它 - Shell 命令建议用
&&链式调用,比如"npm ci && npm run build",前面失败后面不执行 - PHP 方法里捕获异常后,显式调用
$event->getIO()->error($e->getMessage())并exit(1),避免静默吞错
post-install-cmd 里跑 PHPUnit,但此时 vendor/bin/phpunit 还没生成(因为 bin-dir 生成在事件之后)。这种得换到 post-autoload-dump,或者干脆拆成两个事件链。










