你可能需要改變和擴展 Composer 加入自定義的功能。例如:如果你的環(huán)境對 Composer 的行為有特殊要求,而這并不適用于普通用戶。又或者,你想使用 Composer 完成某些事情,而又不希望對普通用戶造成影響。
在這些情況下,你可以考慮創(chuàng)建一個插件來處理特定的邏輯。
一個插件就是一個普通的 Composer 資源包,插件的主要代碼都位于這個包中,并且還可以依賴更多其它的資源包。
插件包內(nèi)的文件和普通資源包相同,但必須滿足下列要求:
composer-plugin
。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\Composer
和 Composer\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
。
插件可用事件如下:
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)安裝的插件。這或許是特別有用的,如果任何插件會導致錯誤,而你想要升級或卸載它。
更多建議: