comodojo/composer-events-handler

dev-master 2017-04-19 10:14 UTC

This package is auto-updated.

Last update: 2024-09-05 18:39:21 UTC


README

此包包含一个允许您创建在 composer installcomposer update 期间执行的安装程序的 Composer 插件

为什么你需要这个插件?

如果您是 Composer 的忠实用户,您可能知道您可以在项目 composer.json 中添加安装后脚本,但由于某些原因,您不能对每个子包都这样做。

实际上,由于可能引起的安全问题,Composer 本身并没有原生实现这一点,但在您在受控环境中工作,并试图在各种工作组之间组织开发过程时,您可能需要能够在安装后立即初始化您的包。

您可能需要初始化数据库,创建表,设置变量或在安装路径下创建文件夹。无论您要做什么,这类事情都应该在代码首次执行之前完成。这就是您需要此插件的原因。

安装

安装 composer,然后

composer require comodojo/composer-events-handler 0.0.*

如何使其工作

此包实现为一个 Composer 插件。这意味着您不能手动执行此代码。它将在每次安装或更新后由 composer 本身加载。

在您的主项目中安装此插件后,为了使其工作,您需要在子包中遵循以下两个步骤

步骤 1:创建设置类

您需要在您的包中创建一个类,该类扩展了抽象类 \Comodojo\Composer\EventsHandler 并实现以下一个或多个方法

public function install()    {} // Called after the installation of the package (including root package)
public function update()     {} // Called after the package has been updated
public function uninstall()  {} // Called before the package is uninstalled (you can use it to clean up)
public function finalize()   {} // Always called after composer has finished doing its job (install, update, create-project)

例如

namespace MyProject\MyApp;

class MyAppSetup extends \Comodojo\Composer\EventsHandler {

    public function finalize() {

		// Do awesome stuff

    }

}

步骤 2:将安装信息添加到您的 composer.json

当您的设置类准备好后,您需要将其引用到包的 composer.json 中。在 extra 字段下,您需要创建一个名为 composer-events-handler 的数组,该数组列出了您创建的所有设置类(是的,您可以根据需要创建尽可能多的设置类)

{
    "extra": {
        "composer-events-handler": [
            "MyProject\\MyApp\\MyAppSetup"
        ]
    }
}

这些程序将以它们在 composer-events-handler 数组中列出的顺序执行。

如何处理包之间的依赖关系

当您在包含许多包的大项目中工作时,可能会发生这样的情况,即您的设置类依赖于另一个包创建的信息或文件。遗憾的是,Composer 框架不允许我们知道各种类将以何种顺序执行。基本上,您可以在一个包内控制执行顺序,但您不知道哪个包会先安装。这是因为更新或新包在其它包之前捕获更新事件。

最佳实践应该是完全不创建包之间的依赖关系,但说句实话,这是相当不可能的。处理此问题的方法完全取决于您的编码技能,但为了帮助您,我们引入了 retry() 方法。您可以将所有依赖于其他包的代码放入设置类的一个或多个方法中,然后通过 retry() 方法调用它们。

namespace MyProject\MyApp;

class MyAppSetup extends \Comodojo\Composer\EventsHandler {

    public function install() {

		// Do awesome stuff

		$this->retry("doStuff");

    }

    public function doStuff() {

    	// load an object that may be installed by another package
    	try {

    		$obj = new MyOtherPackageObject();

    		$obj->doSomethingAwesome();

    	} catch (\Exception $e) {

    		throw $e;

    	}

    }

}

如果这些方法的执行失败,整个包将被添加到失败执行队列中。当所有安装完成时,所有失败的设置将再次执行。当然,执行可能再次失败。原因可能如下

  • 执行失败是由于编码错误(请检查日志文件以获取错误信息列表)
  • 该包依赖于另一个安装也失败的包

如果是这种情况,您可以再次尝试运行 composer update

日志文件

为了保持整洁,此插件仅在屏幕上打印少量信息。它会告诉您正在安装哪个包以及执行是否已完成或失败。如果您想了解您的安装出现了什么问题,所有异常信息都存储在日志文件中。默认情况下,此日志设置为 ./composer-events.log,但您可以通过编辑根包(项目)的 composer.json 来按需配置它,如下所示

{
    "extra": {
        "composer-events-log": "./path-to-my-file.log"
    }
}

贡献

欢迎贡献,并将得到完全认可。有关详细信息,请参阅CONTRIBUTING

许可证

comodojo/composer-events-handler 在 MIT 许可证(MIT)下发布。有关更多信息,请参阅许可证文件