Composer插件是通过实现PluginInterface并在activate()中订阅事件来扩展Composer行为的工具,本质为事件驱动+服务注册,需声明type为composer-plugin并指定入口类。

Composer 插件是运行在 Composer 生命周期中、能修改其行为的 PHP 包,不是用来被项目 require 的功能库,而是用来扩展或干预 Composer 自身逻辑的工具 —— 比如自动加载优化、包下载前校验、安装后执行脚本、甚至重写依赖解析规则。
插件的本质:事件驱动 + 服务注册
Composer 插件不是靠“被调用”工作的,而是通过实现 ComposerPluginPluginInterface,并在 activate() 方法中向 Composer 的事件分发器(EventDispatcher)订阅事件,比如:
-
pre-autoload-dump:生成自动加载文件前 -
post-install-cmd或post-update-cmd:命令执行完成后 -
pre-package-install:某个包真正下载前(可取消/替换) -
init:Composer 初始化时(适合注册自定义命令)
插件本身必须声明为 "type": "composer-plugin",并设置 "extra": {"class": "Your\Plugin\Class"} 指明入口类。Composer 会扫描已安装的包,自动激活所有符合规范的插件。
开发一个最小可用插件
假设你想在每次 composer install 后打印一行带时间戳的提示:
- 新建目录
my-company/composer-timestamp-plugin - 写
src/TimestampPlugin.php:
namespace MyCompanyComposer;
use ComposerComposer;
use ComposerIOIOInterface;
use ComposerPluginPluginInterface;
use ComposerEventDispatcherEventSubscriberInterface;
use ComposerScriptScriptEvents;
class TimestampPlugin implements PluginInterface, EventSubscriberInterface
{
private $io;
public function activate(Composer $composer, IOInterface $io)
{
$this->io = $io;
}
public static function getSubscribedEvents()
{
return [
ScriptEvents::POST_INSTALL_CMD => 'onPostInstall',
ScriptEvents::POST_UPDATE_CMD => 'onPostUpdate',
];
}
public function onPostInstall()
{
$this->io->write("✅ Install completed at " . date('Y-m-d H:i:s'));
}
public function onPostUpdate()
{
$this->io->write("? Update completed at " . date('Y-m-d H:i:s'));
}
}登录后复制
再写 composer.json:
{
"name": "my-company/composer-timestamp-plugin",
"type": "composer-plugin",
"autoload": {
"psr-4": { "MyCompany\Composer\": "src/" }
},
"require": {
"composer-plugin-api": "^2.0"
},
"extra": {
"class": "MyCompany\Composer\TimestampPlugin"
}
}登录后复制
然后在目标项目中运行:composer require my-company/composer-timestamp-plugin --dev,插件即生效。
还木有评论哦,快来抢沙发吧~