Composer 通过 composer.json 中的 post-install-cmd 和 post-update-cmd 脚本事件在安装或更新依赖后自动执行命令,支持 shell 命令、脚本别名及静态方法调用,需正确配置 scripts 字段并确保环境未禁用脚本。

Composer 在安装或更新依赖后自动执行脚本,靠的是 scripts 配置中的 post-install-cmd 和 post-update-cmd 事件。只要在 composer.json 里正确定义,Composer 就会在对应操作完成后自动触发。
在 composer.json 中配置 post-install-cmd
打开项目根目录下的 composer.json,在 scripts 字段中添加命令。如果该字段不存在,可以新建一个:
"scripts": {
"post-install-cmd": [
"@php artisan clear-compiled",
"@php artisan optimize"
]
}
说明:
- 数组内每项都会按顺序执行;支持原生命令(如
php artisan ...)、Composer 脚本别名(以@开头,如@php表示当前 PHP 可执行文件); -
post-install-cmd仅在运行composer install(且vendor/为空或不存在时)触发; - 若想同时兼容
install和update,可把相同逻辑也加到post-update-cmd中。
支持自定义 PHP 函数或类方法
除了 shell 命令,还可以直接调用静态方法:
"scripts": {
"post-install-cmd": [
"MyVendor\\MyPackage\\ScriptHandler::buildAssets"
]
}
要求:
- 对应类必须已通过 autoloader 加载(通常放在
autoload/files或autoload/classmap中); - 方法必须是
public static,且接受一个Composer\Script\Event参数; - 例如:在
src/ScriptHandler.php中定义后,记得在composer.json的autoload中注册路径。
启用脚本执行(避免被跳过)
默认情况下,Composer 会执行脚本,但以下情况可能不触发:
- 使用了
--no-scripts参数(如composer install --no-scripts); - 在 CI/CD 环境中,某些镜像或配置禁用了脚本(检查是否设置了
COMPOSER_NO_INTERACTION=1或COMPOSER_DISCARD_CHANGES=1,这些不影响脚本执行,但--no-scripts会); - 脚本本身报错并中断后续执行(可用
"@php -r \"echo 'done';\" || true"忽略单条失败,但不推荐用于关键逻辑)。
验证脚本是否生效
最简单的方法是加一条调试输出:
"post-install-cmd": [
"@php -r \"file_put_contents('install.log', date('Y-m-d H:i:s') . ' install done\\n', FILE_APPEND);\""
]
然后运行 composer install,检查日志文件是否生成、内容是否更新。成功即说明钩子已激活。
基本上就这些。关键是写对 composer.json 的 scripts 结构,确保命令语法合法,且环境允许执行——不复杂但容易忽略大小写或引号嵌套问题。










