搜索
首页开发工具composer如何创建 Composer 插件

如何创建 Composer 插件

Aug 15, 2019 pm 02:32 PM
composer

下面由composer教程栏目为大家讲解如何创建 Composer 插件,希望对需要的朋友有所帮助!

如何创建 Composer 插件

设置和使用插件

概要

您可能希望使用自己的功能更改或扩展 Composer 的功能。例如,如果您的环境对 Composer 的行为提出了特殊要求,这些要求不适用于大多数用户,或者您希望以大多数用户不希望的方式使用 Composer 完成某些任务。

在这些情况下,您可以考虑创建一个插件来处理您的特定逻辑。

创建一个插件

插件是一个常规的 Composer 包,它将代码作为包的一部分提供,也可能依赖于其他包。

插件包

包文件与任何其他包文件相同,但具有以下要求:

●  type 属性必须是 composer-plugin.

●   extra 属性必须包含一个元素 class,用于定义插件的类名(包括命名空间)。如果包中包含多个插件,则可以是类名称数组。

●  您需要依赖名为 composer-plugin-api 的特殊包来定义插件兼容的插件 API 版本。

所需的 composer-plugin-api 版本遵循与普通包相同的 规则 。

当前的 composer 插件 API 版本是 1.1.0。

常规的插件 composer.json 文件的示例(省略了自动加载部分):

{
    "name": "my/plugin-package",
    "type": "composer-plugin",
    "require": {
        "composer-plugin-api": "^1.1"
    },
    "extra": {
        "class": "My\\Plugin"
    }
}

插件类

每个插件都必须提供一个实现  Composer\Plugin\PluginInterface 的类。 加载插件后调用插件的 activate() 方法并接收 Composer\Composer 以及 Composer\IO\IOInterface 的实例。使用这两个对象可以读取所有配置,并且可以根据需要操纵所有内部对象和状态。

例如:

<?php
namespace phpDocumentor\Composer;
use Composer\Composer;
use Composer\IO\IOInterface;
use Composer\Plugin\PluginInterface;
class TemplateInstallerPlugin implements PluginInterface
{
    public function activate(Composer $composer, IOInterface $io)
    {
        $installer = new TemplateInstaller($io, $composer);
        $composer->getInstallationManager()->addInstaller($installer);
    }
}

事件处理器

此外,插件可以实现 Composer\EventDispatcher\EventSubscriberInterface 以便在加载插件时让其事件处理程序自动注册到 EventDispatcher 。

要将方法注册到事件,请实现方法 getSubscribedEvents() 并让它返回一个数组。 数组键必须是 事件名称 并且对应的键值是要调用的此类中方法的名称。

public static function getSubscribedEvents()
{
    return array(
        &#39;post-autoload-dump&#39; => &#39;methodToBeCalled&#39;,
        // ^ event name ^         ^ method name ^
    );
}

默认情况下,事件处理程序的优先级设置为 0。可以通过附加元组来更改优先级,其中第一个值是方法名称,如前所述,第二个值是表示优先级的整数。更高的整数代表更高的优先级。优先级 2 在优先级 1 之前调用,等等。

public static function getSubscribedEvents()
{
    return array(
        // Will be called before events with priority 0
        &#39;post-autoload-dump&#39; => array(&#39;methodToBeCalled&#39;, 1)
    );
}

如果应该调用多个方法,则可以将每个事件附加一个元组数组。元组不需要包含优先级。如果省略,则默认为 0。

public static function getSubscribedEvents()
{
    return array(
        &#39;post-autoload-dump&#39; => array(
            array(&#39;methodToBeCalled&#39;      ), // Priority defaults to 0
            array(&#39;someOtherMethodName&#39;, 1), // This fires first
        )
    );
}

完整示例:

<?php
namespace Naderman\Composer\AWS;
use Composer\Composer;
use Composer\EventDispatcher\EventSubscriberInterface;
use Composer\IO\IOInterface;
use Composer\Plugin\PluginInterface;
use Composer\Plugin\PluginEvents;
use Composer\Plugin\PreFileDownloadEvent;
class AwsPlugin implements PluginInterface, EventSubscriberInterface
{
    protected $composer;
    protected $io;
    public function activate(Composer $composer, IOInterface $io)
    {
        $this->composer = $composer;
        $this->io = $io;
    }
    public static function getSubscribedEvents()
    {
        return array(
            PluginEvents::PRE_FILE_DOWNLOAD => array(
                array(&#39;onPreFileDownload&#39;, 0)
            ),
        );
    }
    public function onPreFileDownload(PreFileDownloadEvent $event)
    {
        $protocol = parse_url($event->getProcessedUrl(), PHP_URL_SCHEME);
        if ($protocol === &#39;s3&#39;) {
            $awsClient = new AwsClient($this->io, $this->composer->getConfig());
            $s3RemoteFilesystem = new S3RemoteFilesystem($this->io, $event->getRemoteFilesystem()->getOptions(), $awsClient);
            $event->setRemoteFilesystem($s3RemoteFilesystem);
        }
    }
}

插件功能

Composer 定义了一组可由插件实现的标准功能。通过为常见的插件需求提供明确的扩展点,减少了弄乱  Composer\Composer 内部状态的需求,使插件生态系统更加稳定。

Capable Plugins 类必须实现 Composer\Plugin\Capable 接口并在 getCapabilities() 方法中声明它们的功能。这个方法必须要返回一个数组,并且数组的 key 为 Composer Capability 类名称,value 为作为 Plugin 自己的实现类名称:

<?php
namespace My\Composer;
use Composer\Composer;
use Composer\IO\IOInterface;
use Composer\Plugin\PluginInterface;
use Composer\Plugin\Capable;
class Plugin implements PluginInterface, Capable
{
    public function activate(Composer $composer, IOInterface $io)
    {
    }
    public function getCapabilities()
    {
        return array(
            &#39;Composer\Plugin\Capability\CommandProvider&#39; => &#39;My\Composer\CommandProvider&#39;,
        );
    }
}

命令提供者

Composer\Plugin\Capability\CommandProvider 功能允许为 Composer 注册其它命令:

<?php
namespace My\Composer;
use Composer\Plugin\Capability\CommandProvider as CommandProviderCapability;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Composer\Command\BaseCommand;
class CommandProvider implements CommandProviderCapability
{
    public function getCommands()
    {
        return array(new Command);
    }
}
class Command extends BaseCommand
{
    protected function configure()
    {
        $this->setName(&#39;custom-plugin-command&#39;);
    }
    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $output->writeln(&#39;Executing&#39;);
    }
}

现在, custom-plugin-command 与 Composer 命令一起提供。

Composer 命令是基于 Symfony Console Component 控制台组件的。

使用插件

插件包在安装后将会自动加载,如果在当前项目的已安装软件包列表中找到,则会在编译器启动时加载。此外,在加载本地项目插件之前,将使用 composer global 命令在 COMPOSER_HOME 目录中安装所有插件包。

您可以将 --no-plugins 选项传递给 Composer 命令以禁用所有已安装的插件。如果有插件造成错误,您希望更新或卸载它,这可能特别有用。

更多composer使用技术文章,请访问composer命令使用图文教程栏目!

以上是如何创建 Composer 插件的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作曲家的资格:评估能力作曲家的资格:评估能力Apr 24, 2025 am 12:15 AM

Composer使用熟练程度可以通过以下四个方面评估:1)理解基础概念,如包、依赖和版本控制;2)掌握核心功能,包括解析composer.json、解决依赖、下载包和生成autoload文件;3)熟练使用基本和高级命令,如composerinstall、update、require和dump-autoload;4)应用最佳实践,如使用composer.lock文件、优化autoload配置和定期清理缓存。

作曲家:利用AI进行自动任务作曲家:利用AI进行自动任务Apr 23, 2025 am 12:03 AM

使用Composer结合AI可以实现自动化任务。1.Composer通过配置文件管理依赖,AI可优化版本选择。2.在实际应用中,AI可用于自动化依赖管理、测试和部署。3.性能优化包括依赖加载和缓存策略。4.需注意版本冲突和AI误判等问题。通过这些方法,AI能提升工作效率和智能化程度。

与AI:代码建议和见解的作曲家与AI:代码建议和见解的作曲家Apr 22, 2025 am 12:05 AM

ComposerwithAI是利用AI提升编程体验的工具。1)它通过分析代码结构、语法和模式,提供实时建议和错误修复。2)高级功能包括代码重构、性能优化和安全性检查。3)使用时可调整配置、提供反馈和结合其他工具来解决常见问题。

作曲家:PHP依赖管理器的简介作曲家:PHP依赖管理器的简介Apr 21, 2025 am 12:02 AM

Composer是PHP的依赖管理工具,用于管理项目所需的库和包。1)它通过composer.json文件定义依赖,2)使用命令行工具进行安装和更新,3)自动化依赖管理过程,提高开发效率,4)支持高级功能如动态添加依赖和自动加载,5)通过composer.lock文件确保团队环境一致性。

作曲家的目的:有效地管理依赖关系作曲家的目的:有效地管理依赖关系Apr 20, 2025 am 12:04 AM

Composer是PHP的依赖管理工具,通过composer.json和composer.lock文件管理项目依赖。1.创建composer.json文件并运行composerinstall安装依赖。2.使用composerrequire添加新依赖。3.配置autoload实现类自动加载。4.使用composerdiagnose检查项目健康状况。5.优化依赖管理:指定包名更新,使用composerdump-autoload-o优化自动加载器,生产环境使用composerinstall--no-d

作曲家和AI:PHP开发中的新可能性作曲家和AI:PHP开发中的新可能性Apr 19, 2025 am 12:03 AM

AI与Composer结合可提升PHP开发效率和安全性。具体体现在:1.依赖解析和优化:AI可预测依赖关系,减少冲突。2.自动化安全检查:AI能识别安全漏洞,建议更新。3.代码生成和优化:AI能自动生成和优化相关代码。

使用DICR/YII2-Google将Google API集成在YII2中使用DICR/YII2-Google将Google API集成在YII2中Apr 18, 2025 am 11:54 AM

vProcesserazrabotkiveb被固定,мнелостольностьстьс粹馏标д都LeavallySumballanceFriablanceFaumDoptoMatification,Čtookazalovnetakprosto,kakaožidal.posenesko

如何使用 Composer 解决 JSON Schema 验证问题如何使用 Composer 解决 JSON Schema 验证问题Apr 18, 2025 am 11:51 AM

在开发一个基于Symfony的应用程序时,我遇到了一个棘手的问题:如何有效地验证JSON数据格式。最初,我尝试使用手动编写的验证代码,但这不仅复杂,而且容易出错。经过一番探索,我发现了一个名为ptyhard/json-schema-bundle的Composer包,它为我的项目带来了极大的便利和效率。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

安全考试浏览器

安全考试浏览器

Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

Atom编辑器mac版下载

Atom编辑器mac版下载

最流行的的开源编辑器

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

将Eclipse与SAP NetWeaver应用服务器集成。

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

SecLists

SecLists

SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。