comodojo / composer-events-handler
Requires
- composer-plugin-api: ^1.0
- comodojo/exceptions: ^1.0
- monolog/monolog: ^1.0
This package is auto-updated.
Last update: 2024-09-05 18:39:21 UTC
README
此包包含一个允许您创建在 composer install
或 composer 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)下发布。有关更多信息,请参阅许可证文件。