什么是Composer插件(Plugin)?如何开发一个?(高级教程)

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

什么是Composer插件(Plugin)?如何开发一个?(高级教程)-第1张图片-佛山资讯网

Composer 插件是运行在 Composer 生命周期中、能修改其行为的 PHP 包,不是用来被项目 require 的功能库,而是用来扩展或干预 Composer 自身逻辑的工具 —— 比如自动加载优化、包下载前校验、安装后执行脚本、甚至重写依赖解析规则。

插件的本质:事件驱动 + 服务注册

Composer 插件不是靠“被调用”工作的,而是通过实现 ComposerPluginPluginInterface,并在 activate() 方法中向 Composer 的事件分发器(EventDispatcher)订阅事件,比如:

  • pre-autoload-dump:生成自动加载文件前
  • post-install-cmdpost-update-cmd:命令执行完成后
  • pre-package-install:某个包真正下载前(可取消/替换)
  • init:Composer 初始化时(适合注册自定义命令)

插件本身必须声明为 "type": "composer-plugin",并设置 "extra": {"class": "Your\Plugin\Class"} 指明入口类。Composer 会扫描已安装的包,自动激活所有符合规范的插件。

开发一个最小可用插件

假设你想在每次 composer install 后打印一行带时间戳的提示:

  1. 新建目录 my-company/composer-timestamp-plugin
  2. 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,插件即生效。

标签: php js json composer 工具

发布评论 0条评论)

还木有评论哦,快来抢沙发吧~