Composer Scripts 是在 composer.json 中定义的自动化钩子,用于在安装、更新等事件前后执行 PHP 函数或命令行脚本,支持闭包、类方法和外部命令,可实现项目初始化、缓存清理等任务,提升开发效率。

Composer Scripts 是 Composer 提供的一个强大功能,允许你在 Composer 执行某些生命周期事件时自动运行自定义脚本。这些脚本可以是 PHP 函数、命令行指令或外部脚本文件,常用于自动化项目初始化、测试、构建、部署等任务。
什么是 Composer Scripts
Composer Scripts 是在 composer.json 文件中通过 "scripts" 字段定义的钩子函数。它们会在特定的 Composer 命令执行前后被触发,例如安装依赖(install)、更新包(update)或自动加载生成后。
常见的内置事件包括:
- pre-install-cmd:在 install 命令执行前触发
- post-install-cmd:在 install 命令执行后触发
- pre-update-cmd:在 update 命令执行前触发
- post-update-cmd:在 update 命令执行后触发
- post-autoload-dump:在自动加载文件生成后触发
- post-create-project-cmd:在使用 create-project 创建项目后运行
如何编写 Composer 脚本
脚本支持三种类型:闭包函数、类静态方法、可执行命令。
1. 使用闭包函数(推荐用于简单逻辑)
在 composer.json 中注册闭包:
"scripts": {
"post-install-cmd": [
"echo '安装完成!'"
]
}
更复杂的逻辑可以用 PHP 闭包(需放在独立的文件中并通过 autoload 加载):
"scripts": {
"post-install-cmd": [
"My\\Scripts::onPostInstall"
]
}
然后创建对应的 PHP 类文件:
getIO();
$io->write("恭喜,项目已成功安装! ");
}
}
2. 使用外部命令(如 shell 脚本、Node.js 等)
你可以调用系统命令或脚本:
"scripts": {
"post-update-cmd": "php artisan optimize",
"post-create-project-cmd": [
"chmod -R 755 bootstrap/cache",
"npm install && npm run build"
]
}
3. 定义自定义脚本命令
除了监听内置事件,你也可以定义自己的脚本别名:
"scripts": {
"dev-setup": [
"composer install",
"php artisan key:generate",
"php artisan migrate --seed"
],
"build": "npm run production"
}
然后通过以下方式运行:
composer run dev-setup composer run build
脚本使用技巧与注意事项
编写和使用脚本时需要注意以下几点:
- 确保脚本路径正确,特别是引用 PHP 类时要能被自动加载(建议将脚本类放在 scripts/ 或 app/Console 目录并配置 autoload)
- 多行命令用数组形式列出,按顺序执行
- 脚本失败会中断 Composer 流程,除非使用
|| true忽略错误 - 调试脚本时可加
-v参数查看详细输出:composer install -v - 避免在脚本中阻塞用户输入,除非明确需要交互
示例:结合 Laravel 项目的常见脚本配置
{
"scripts": {
"post-autoload-dump": "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump",
"post-create-project-cmd": [
"php -r \"file_exists('.env') || copy('.env.example', '.env');\"",
"php artisan key:generate"
],
"post-update-cmd": [
"php artisan config:clear",
"php artisan route:clear"
],
"test": "phpunit"
}
}
这样就可以在每次更新依赖后自动清理缓存,提升开发效率。
基本上就这些。Composer Scripts 让项目初始化和维护变得更自动化,合理使用能显著减少重复操作。关键是写清楚脚本逻辑,并确保跨平台兼容性(比如 Windows 和 Linux 路径差异)。










