container->singleton(ComposerAdapter::class, function (Container $container) { // This should only ever be resolved when running composer commands, // because we modify other environment configurations. $composer = new Application(); $composer->setAutoExit(false); /** @var Paths $paths */ $paths = $container->make(Paths::class); putenv("COMPOSER_HOME={$paths->storage}/.composer"); putenv("COMPOSER={$paths->base}/composer.json"); Config::$defaultConfig['vendor-dir'] = $paths->vendor; // When running simple require, update and remove commands on packages, // composer 2 doesn't really need this much unless the extensions are very loaded dependency wise, // but this is necessary for running flarum updates. @ini_set('memory_limit', '1G'); @set_time_limit(5 * 60); return new ComposerAdapter($composer, $container->make(OutputLogger::class)); }); $this->container->alias(ComposerAdapter::class, 'flarum.composer'); $this->container->singleton(OutputLogger::class, function (Container $container) { $logPath = $container->make(Paths::class)->storage.'/logs/composer/output.log'; $handler = new RotatingFileHandler($logPath, Logger::INFO); $handler->setFormatter(new LineFormatter(null, null, true, true)); $logger = new Logger('composer', [$handler]); return new OutputLogger($logger); }); } public function boot(Container $container) { /** @var Dispatcher $events */ $events = $container->make('events'); $events->listen( [Updated::class], function (Updated $event) use ($container) { /** @var ExtensionManager $extensions */ $extensions = $container->make(ExtensionManager::class); if ($extensions->isEnabled($event->extension->getId())) { $recompile = new RecompileFrontendAssets( $container->make('flarum.assets.forum'), $container->make(LocaleManager::class) ); $recompile->flush(); $extensions->migrate($event->extension); $event->extension->copyAssetsTo($container->make('filesystem')->disk('flarum-assets')); } } ); $events->listen(FlarumUpdated::class, PostUpdateListener::class); } }