适合做清理操作的 scripts 钩子是 pre-install-cmd 和 post-install-cmd:前者在 install 开始前清理旧构建产物和临时文件,后者在 install 成功后清理缓存与残留包;pre-update-cmd 和 post-update-cmd 同理适用于 update 场景。

Composer 的 scripts 可以在安装依赖前后自动执行命令,比如清理缓存、删除临时文件或生成的构建产物。关键在于选择合适的脚本钩子,并确保命令安全、幂等。
哪些 scripts 钩子适合做清理操作?
Composer 提供多个生命周期钩子,与“安装前后”直接相关的主要有:
-
pre-install-cmd:在
composer install开始前触发,适合清理旧构建产物、临时目录 -
post-install-cmd:在
composer install成功完成后触发,适合清理下载缓存、压缩包残留 -
pre-update-cmd 和 post-update-cmd:对应
composer update场景,逻辑类似
在 composer.json 中配置清理脚本
以清理 vendor/bin 下的旧二进制软链接、删除 composer.lock.bak 和临时 zip 包为例:
{
"scripts": {
"pre-install-cmd": [
"@php -r \"if (is_file('composer.lock.bak')) unlink('composer.lock.bak');\""
],
"post-install-cmd": [
"@php -r \"array_map('unlink', glob('*.zip'));\"",
"rm -rf vendor/bin/*-old"
]
}
}
注意:
– 使用 @php -r 可避免跨平台问题(如 Windows 不支持 rm);
– 命令应尽量幂等(重复执行无副作用),例如先判断文件是否存在再删除;
– 避免在 post-install-cmd 中删 vendor/ 自身,否则会破坏刚安装的依赖。
更健壮的清理方式:封装成独立脚本
复杂逻辑建议写成 PHP 脚本(如 scripts/cleanup.php),再在 scripts 中调用:
"post-install-cmd": [ "php scripts/cleanup.php" ]
scripts/cleanup.php 示例:
这样便于测试、复用,也更容易处理异常和日志。
注意事项与常见陷阱
–
pre-install-cmd在没有composer.lock时可能不执行(如首次install且无 lock 文件),需考虑兼容性;
– 清理操作不要依赖尚未安装的包(比如在pre-install-cmd中调用vendor/bin/phpunit会失败);
– 若项目使用 Docker 或 CI,确认脚本中路径是容器内路径,且有对应权限;
– 可配合composer run-script手动触发调试,例如:composer run-script post-install-cmd。










