Composer 插件

2018-09-28 20:24 更新

插件

概述

你可能需要改變和擴展 Composer 加入自定義的功能。例如:如果你的環(huán)境對 Composer 的行為有特殊要求,而這并不適用于普通用戶。又或者,你想使用 Composer 完成某些事情,而又不希望對普通用戶造成影響。

在這些情況下,你可以考慮創(chuàng)建一個插件來處理特定的邏輯。

創(chuàng)建一個插件

一個插件就是一個普通的 Composer 資源包,插件的主要代碼都位于這個包中,并且還可以依賴更多其它的資源包。

插件包

插件包內(nèi)的文件和普通資源包相同,但必須滿足下列要求:

  1. type 屬性必須是 composer-plugin。
  2. extra 屬性必須包含一個元素 class,它定義了插件類的名稱(包含命名空間)。如果一個包中含有多個插件,則可以使用數(shù)組來定義類名。

此外,你必須 require 一個特殊的資源包 composer-plugin-api,定義與你的插件相兼容的 composer plugin API 版本。目前 composer plugin API 的版本為1.0.0。

實例:

{
    "name": "my/plugin-package",
    "type": "composer-plugin",
    "require": {
        "composer-plugin-api": "1.0.0"
    }
}

插件類

每一個插件都必須提供一個實現(xiàn)了 Composer\Plugin\PluginInterface 接口的類。類中的 activate() 方法在插件載入后被調(diào)用,并接收兩個類的實例:Composer\ComposerComposer\IO\IOInterface。使用這兩個對象可以讀取所有的配置,操作所有的內(nèi)部對象和狀態(tài)。

實例:

<?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);
    }
}

事件處理程序

此外,插件還可以實現(xiàn) Composer\EventDispatcher\EventSubscriberInterface 接口,為了在插件載入后自動注冊事件處理程序到 EventDispatcher

插件可用事件如下:

  • COMMAND 在載入插件的所有命令前被調(diào)用。它為你提供了訪問程序輸入輸出的對象。
  • PRE_FILE_DOWNLOAD 在文件下載前被觸發(fā),它允許你在下載前根據(jù)目標 URL 操作 RemoteFilesystem 對象。

    一個插件也可以訂閱 腳本事件。

實例:

<?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('onPreFileDownload', 0)
            ),
        );
    }

    public function onPreFileDownload(PreFileDownloadEvent $event)
    {
        $protocol = parse_url($event->getProcessedUrl(), PHP_URL_SCHEME);

        if ($protocol === 's3') {
            $awsClient = new AwsClient($this->io, $this->composer->getConfig());
            $s3RemoteFilesystem = new S3RemoteFilesystem($this->io, $event->getRemoteFilesystem()->getOptions(), $awsClient);
            $event->setRemoteFilesystem($s3RemoteFilesystem);
        }
    }
}

使用插件

插件包是優(yōu)先被安裝和加載的,在 Composer 啟動時,如果在已安裝資源包的當前項目列表中被找到,它們將被自動加載。此外,所有的插件包將被安裝在 COMPOSER_HOME 目錄,以便在 Composer 全局命令前載入,在操作本地項目前插件就已經(jīng)被載入。

你可以通過 --no-plugins 選項讓 composer 的命令禁用所有已經(jīng)安裝的插件。這或許是特別有用的,如果任何插件會導致錯誤,而你想要升級或卸載它。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號