创建Composer插件需定义类型为composer-plugin的包,实现PluginInterface接口,并在extra.class中指定入口类。通过监听事件如post-install-cmd可执行自定义逻辑。使用时可通过本地路径引用或发布到Packagist,安装后Composer会自动激活插件并运行相应方法。

创建和使用一个 Composer 插件,本质上是开发一个 PHP 包,该包通过实现特定接口来扩展 Composer 的功能。Composer 插件可以在安装、更新、卸载包等过程中执行自定义逻辑,比如自动配置、生成文件或修改依赖行为。
创建一个 Composer 插件
要创建一个 Composer 插件,需要满足几个条件:正确的包类型、实现插件接口、在 composer.json 中声明插件信息。
进入你的项目目录,运行:
mkdir my-composer-plugin cd my-composer-plugin composer init在初始化过程中,设置包名(如
your-vendor/my-composer-plugin),类型设为 composer-plugin。
2. 设置 composer.json确保
composer.json 包含以下关键字段:
{
"name": "your-vendor/my-composer-plugin",
"type": "composer-plugin",
"require": {
"composer-plugin-api": "^2.0",
"composer/composer": "^2.0"
},
"autoload": {
"psr-4": {
"My\\Composer\\Plugin\\": "src/"
}
},
"extra": {
"class": "My\\Composer\\Plugin\\MyPlugin"
}
}
说明:
- type: composer-plugin 是必须的,让 Composer 知道这是一个插件。
- composer-plugin-api 提供插件接口。
- composer/composer 提供核心类,如 IO、Event 等。
- extra.class 指定插件入口类,Composer 加载时会实例化这个类。
创建目录
src/ 并添加主类文件 MyPlugin.php:
composer = $composer;
$this->io = $io;
}
public static function getSubscribedEvents()
{
return [
ScriptEvents::POST_INSTALL_CMD => 'onPostInstall',
ScriptEvents::POST_UPDATE_CMD => 'onPostUpdate',
];
}
public function onPostInstall($event)
{
$this->io->write('[MyPlugin] 安装完成,执行自定义操作... ');
// 可以在这里执行文件生成、配置写入等
}
public function onPostUpdate($event)
{
$this->io->write('[MyPlugin] 更新完成,清理缓存... ');
}
}
这个插件监听了安装和更新命令后的事件,并输出提示信息。
使用你创建的插件
本地测试或在其他项目中使用该插件,有几种方式。
1. 本地路径引用(开发阶段)在目标项目的
composer.json 中添加仓库和依赖:
{
"repositories": [
{
"type": "path",
"url": "../my-composer-plugin"
}
],
"require": {
"your-vendor/my-composer-plugin": "*"
}
}
然后运行:
composer require your-vendor/my-composer-pluginComposer 会软链接插件到
vendor,并自动激活它(因为是插件类型)。
2. 发布到 Packagist(正式使用)将插件推送到 GitHub 或 GitLab,然后发布到 Packagist。其他项目只需:
composer require your-vendor/my-composer-plugin即可自动启用。 3. 验证插件是否生效
运行:
composer install如果看到插件输出的信息,说明已成功加载并执行。
注意事项
- 插件权限较高,可能影响所有 Composer 操作,务必谨慎处理逻辑。
- 确保兼容当前 Composer 主版本(1.x 或 2.x)。
- 避免阻塞操作或抛出未捕获异常。
- 可通过
composer config --list查看已加载插件(部分版本支持)。










