你可能需要改变和扩展 Composer 加入自定义的功能。例如:如果你的环境对 Composer 的行为有特殊要求,而这并不适用于普通用户。又或者,你想使用 Composer 完成某些事情,而又不希望对普通用户造成影响。
在这些情况下,你可以考虑创建一个插件来处理特定的逻辑。
一个插件就是一个普通的 Composer 资源包,插件的主要代码都位于这个包中,并且还可以依赖更多其它的资源包。
插件包内的文件和普通资源包相同,但必须满足下列要求:
composer-plugin
。class
,它定义了插件类的名称(包含命名空间)。如果一个包中含有多个插件,则可以使用数组来定义类名。此外,你必须 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"
}
}
每一个插件都必须提供一个实现了 ComposerPluginPluginInterface
接口的类。类中的 activate()
方法在插件载入后被调用,并接收两个类的实例:ComposerComposer
和 ComposerIOIOInterface
。使用这两个对象可以读取所有的配置,操作所有的内部对象和状态。
实例:
<?php
namespace phpDocumentorComposer;
use ComposerComposer;
use ComposerIOIOInterface;
use ComposerPluginPluginInterface;
class TemplateInstallerPlugin implements PluginInterface
{
public function activate(Composer $composer, IOInterface $io)
{
$installer = new TemplateInstaller($io, $composer);
$composer->getInstallationManager()->addInstaller($installer);
}
}
此外,插件还可以实现 ComposerEventDispatcherEventSubscriberInterface
接口,为了在插件载入后自动注册事件处理程序到 EventDispatcher
。
插件可用事件如下:
PRE_FILE_DOWNLOAD 在文件下载前被触发,它允许你在下载前根据目标 URL 操作 RemoteFilesystem
对象。
一个插件也可以订阅 脚本事件。
实例:
<?php
namespace NadermanComposerAWS;
use ComposerComposer;
use ComposerEventDispatcherEventSubscriberInterface;
use ComposerIOIOInterface;
use ComposerPluginPluginInterface;
use ComposerPluginPluginEvents;
use ComposerPluginPreFileDownloadEvent;
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);
}
}
}
插件包是优先被安装和加载的,在 Composer 启动时,如果在已安装资源包的当前项目列表中被找到,它们将被自动加载。此外,所有的插件包将被安装在 COMPOSER_HOME
目录,以便在 Composer 全局命令前载入,在操作本地项目前插件就已经被载入。
你可以通过 --no-plugins
选项让 composer 的命令禁用所有已经安装的插件。这或许是特别有用的,如果任何插件会导致错误,而你想要升级或卸载它。
Maven - Elipse IDEEclipse 提供一种卓越的插件 m2eclipse,该插件使得 Maven 和 Eclipse 能够无缝集成。下面列出 m2eclipse 的...
Maven 是一个基于 Java 的工具,所以要做的第一件事情就是安装 JDK。系统要求项目要求JDKMaven 3.3 要求 JDK 1.7 或以上Maven 3....
现在,如你所知道的,Maven的依赖管理使用的是 Maven - 仓库 的概念。但是如果在远程仓库和中央仓库中,依赖不能被满足,如何解...
本章介绍了命令行的基本使用。正如在前面的章节里你所见到的调用 gradle 命令来完成一些功能。多任务调用你可以以列表的形式在命...
走进守护进程Gradle 守护进程(有时也称为构建守护进程) 的目的是改善 Gradle 的启动和执行时间。我们准备了几个守护进程非常有...
Git 常用命令速查表 | GIT CHEAT SHEET创建CREATE本地更改LOCAL CHANGES提交历史记录COMMIT HISTORY分支机构和标签BRANCHESTAGS...
在开头前几章我们曾讲过怎么在Vim里设置选项。 对于布尔选项,我们可以使用set someoption!来"切换"选项。 如果我们能给这个命令...