Composer 无内置自动清理机制,但可通过配置 post-install-cmd 或 post-update-cmd 脚本实现:支持 shell 命令、PHP 回调或自定义类方法,推荐幂等的内联 PHP 脚本或 ScriptHandler 类,也可开发插件精细控制;需避免误删核心文件、注意跨平台兼容性及错误处理。

Composer 本身不提供“安装后自动清理”的内置机制,但可以通过配置 scripts 钩子,在包安装完成(post-install-cmd)或更新完成(post-update-cmd)时触发自定义清理逻辑。
在 composer.json 中定义 post-install-cmd 脚本
这是最常用的方式。你可以在项目根目录的 composer.json 文件中添加脚本,让 Composer 在每次 composer install 执行完毕后运行清理命令。
- 支持 shell 命令、PHP 回调函数或可执行脚本文件
- 推荐使用内联 PHP 脚本,便于跨平台且无需额外依赖
- 确保脚本具备幂等性(重复执行无副作用)
示例:清理 vendor/bin 下的冗余软链接和临时文件
(将以下内容加入composer.json 的 "scripts" 字段)
"scripts": {
"post-install-cmd": [
"@php -r \"array_map('unlink', glob('vendor/bin/*.bat'));\"",
"@php -r \"array_map('unlink', glob('vendor/bin/*~'));\"",
"@php -r \"if (is_dir('vendor/composer/installed.json')) { unlink('vendor/composer/installed.json'); }\""
]
}
使用自定义 PHP 类方法作为钩子
适合较复杂的清理逻辑,比如扫描特定目录、删除过期缓存、校验文件完整性等。
- 创建一个类(如
ScriptHandler),放在scripts/或src/目录下 - 在
composer.json中引用该类的静态方法 - 方法接收
Composer\Script\Event对象,可获取 IO、Composer 实例等上下文
示例:
"scripts": {
"post-install-cmd": [
"MyVendor\\MyPackage\\ScriptHandler::cleanupVendorBin"
]
}
对应 PHP 类(需确保自动加载已配置):
namespace MyVendor\MyPackage;
use Composer\Script\Event;
class ScriptHandler
{
public static function cleanupVendorBin(Event $event)
{
$io = $event->getIO();
$vendorBin = __DIR__ . '/../vendor/bin';
if (is_dir($vendorBin)) {
foreach (glob($vendorBin . '/*.sh') as $file) {
@unlink($file);
}
}
$io->write("✓ 清理 vendor/bin 中的 shell 脚本完成");
}
}
结合 Composer 插件实现更精细控制
如果清理逻辑需要深度介入 Composer 生命周期(例如只清理某类包、跳过开发依赖),可考虑编写轻量插件。
- 插件可监听
PostInstallEvent或PostUpdateEvent - 通过
$event->getComposer()->getPackage()获取当前安装的包信息 - 适合构建工具链或团队统一规范场景
注意:插件需声明为 composer-plugin 类型,并在 composer.json 中启用。
避免常见陷阱
脚本看似简单,但容易引发意外问题:
- 不要在清理中误删
vendor/autoload.php或核心 bin 文件(如vendor/bin/phpunit) - Windows 下慎用
rm -rf,优先用 PHP 内置函数(unlink、rmdir、array_map) - 若脚本失败(返回非零退出码),整个
composer install会中断;加@抑制错误或显式return 0;可规避 - CI 环境中建议加上日志输出(用
$event->getIO()->write()),方便排查










