pre-install-cmd在依赖安装前执行,用于环境检查、清理缓存等准备;post-install-cmd在自动加载生成后执行,可用于权限修复、资源构建等收尾。

pre-install-cmd 在 composer install 或 composer update 执行依赖安装逻辑之前运行,适合做环境检查、清理缓存、备份配置等准备动作;post-install-cmd 则在所有包下载、解压、自动加载生成等核心流程完成之后执行,适合做权限修复、生成前端资源、触发服务重启等收尾工作。
pre-install-cmd:安装前的“安检员”
它会在 Composer 开始解析 composer.lock、下载 ZIP、写入 vendor/ 目录之前触发。此时 vendor/ 可能还不存在或不完整,不能依赖已安装的第三方类库(比如你自己的工具包还没装好)。
- 适合检查 PHP 版本、扩展是否启用(如
ext-opcache)、.env 文件是否存在 - 可安全执行
git clean -fdx vendor/或清空bootstrap/cache/ - 不能调用
Illuminate\Support\Str::class这类尚未加载的类 —— 因为 autoloader 还没生成
post-install-cmd:安装后的“收尾人”
此时 vendor/autoload.php 已可 require,所有包已解压到位,autoload_files 和 psr-4 映射也已写入 vendor/composer/autoload_*.php。你可以放心使用项目中声明的所有依赖。
- 常用于执行
php artisan optimize:clear(Laravel)、npm install && npm run build - 修复
storage/和bootstrap/cache/目录权限(Linux/macOS 下常见) - 生成 API 文档、扫描注解、刷新配置缓存(
php artisan config:cache)
实际配置示例(composer.json)
两者都定义在 "scripts" 字段下,值可以是字符串命令或数组形式的多步骤:
"scripts": {
"pre-install-cmd": [
"@php -r \"if (!file_exists('.env')) { copy('.env.example', '.env'); }\"",
"echo '✅ 环境文件检查完成'"
],
"post-install-cmd": [
"@php artisan storage:link",
"@php artisan config:cache",
"@php artisan event:cache"
]
}
注意:@php 是 Composer 内置别名,会自动调用当前 PHP 可执行文件,比硬写 php 更可靠。
容易忽略的关键细节
-
composer install --no-scripts会跳过所有脚本钩子,包括 pre/post -
post-update-cmd和post-install-cmd不等价:前者只在update时触发,后者在install和update都会触发(除非加--no-update) - 脚本失败(返回非 0 状态码)会导致整个 Composer 命令中断 —— 比如权限检查不通过就直接退出,避免脏环境继续运行










