3 namespace Drupal\Console\Composer\Plugin;
6 use Composer\IO\IOInterface;
7 use Composer\Plugin\PluginInterface;
8 use Composer\Script\Event;
9 use Composer\Script\ScriptEvents;
10 use Composer\EventDispatcher\EventSubscriberInterface;
11 use Symfony\Component\Yaml\Yaml;
12 use Symfony\Component\Finder\Finder;
14 // Explicitly require ExtenderManager here.
15 // When this package is uninstalled, ExtenderManager needs to be available any
16 // time this class is available.
17 require_once __DIR__ . '/ExtenderManager.php';
19 class Extender implements PluginInterface, EventSubscriberInterface
22 * @var Composer $composer
27 * @var IOInterface $io
32 * Apply plugin modifications to composer
34 * @param Composer $composer
35 * @param IOInterface $io
37 public function activate(Composer $composer, IOInterface $io)
39 $this->composer = $composer;
44 * Returns an array of event names this subscriber wants to listen to.
46 public static function getSubscribedEvents()
49 ScriptEvents::POST_INSTALL_CMD => "processPackages",
50 ScriptEvents::POST_UPDATE_CMD => "processPackages",
58 public function processPackages(Event $event)
60 $extenderManager = new ExtenderManager();
62 $composer = $event->getComposer();
63 $installationManager = $composer->getInstallationManager();
64 $repositoryManager = $composer->getRepositoryManager();
65 $localRepository = $repositoryManager->getLocalRepository();
67 foreach ($localRepository->getPackages() as $package) {
68 if ($installationManager->isPackageInstalled($localRepository, $package)) {
69 if ($package->getType() === 'drupal-console-library') {
70 $extenderManager->addServicesFile($installationManager->getInstallPath($package) . '/console.services.yml');
71 $extenderManager->addConfigFile($installationManager->getInstallPath($package) . '/console.config.yml');
76 if ($consolePackage = $localRepository->findPackage('drupal/console', '*')) {
77 if ($localRepository->hasPackage($consolePackage)) {
78 $directory = $installationManager->getInstallPath($consolePackage);
81 if (empty($directory)) {
82 // cwd should be the project root. This is the same logic Symfony uses.
83 $directory = getcwd();
86 $configFile = $directory . '/extend.console.config.yml';
87 $servicesFile = $directory . '/extend.console.services.yml';
88 $servicesUninstallFile = $directory . '/extend.console.uninstall.services.yml';
90 if (file_exists($configFile)) {
92 $this->io->write('<info>Removing config cache file:</info>' . $configFile);
95 if (file_exists($servicesFile)) {
96 unlink($servicesFile);
97 $this->io->write('<info>Removing services cache file:</info>' . $servicesFile);
100 if (file_exists($servicesUninstallFile)) {
101 unlink($servicesUninstallFile);
102 $this->io->write('<info>Removing services cache file:</info>' . $servicesUninstallFile);
105 if ($configData = $extenderManager->getConfigData()) {
108 Yaml::dump($configData, 6, 2)
110 $this->io->write('<info>Creating config cache file:</info>' . $configFile);
113 $servicesData = $extenderManager->getServicesData();
114 if ($servicesData && array_key_exists('install', $servicesData)) {
117 Yaml::dump($servicesData['install'], 4, 2)
119 $this->io->write('<info>Creating services cache file: </info>' . $servicesFile);
122 $servicesData = $extenderManager->getServicesData();
123 if ($servicesData && array_key_exists('uninstall', $servicesData)) {
125 $servicesUninstallFile,
126 Yaml::dump($servicesData['uninstall'], 4, 2)
128 $this->io->write('<info>Creating services cache file: </info>' . $servicesUninstallFile);
131 $this->removeCacheFiles();
134 protected function removeCacheFiles()
136 if (is_dir(getcwd().'/console/cache/')) {
138 $finder = new Finder();
140 ->in(getcwd() . '/console/cache/')
141 ->ignoreUnreadableDirs();
143 foreach ($finder as $file) {
144 unlink($file->getPathName());
147 $finder->directories()
148 ->in(getcwd() . '/console/cache/')
149 ->ignoreUnreadableDirs();
151 foreach ($finder as $directory) {
155 } catch (\InvalidArgumentException $argumentException) {
156 $this->io->write('<info>Cache files can not be deleted</info>');