diff --git a/composer.json b/composer.json index a5274e2..15ebc95 100644 --- a/composer.json +++ b/composer.json @@ -34,7 +34,8 @@ "class": [ "Composer\\CustomDirectoryInstaller\\LibraryPlugin", "Composer\\CustomDirectoryInstaller\\PearPlugin", - "Composer\\CustomDirectoryInstaller\\PluginPlugin" + "Composer\\CustomDirectoryInstaller\\PluginPlugin", + "Composer\\CustomDirectoryInstaller\\LifecyclePlugin" ], "branch-alias": { "dev-master": "2.0.x-dev" diff --git a/src/Composer/CustomDirectoryInstaller/LifecyclePlugin.php b/src/Composer/CustomDirectoryInstaller/LifecyclePlugin.php new file mode 100644 index 0000000..c1667f1 --- /dev/null +++ b/src/Composer/CustomDirectoryInstaller/LifecyclePlugin.php @@ -0,0 +1,95 @@ +composer = $composer; + } + + public function deactivate(Composer $composer, IOInterface $io) + { + } + + public function uninstall(Composer $composer, IOInterface $io) + { + } + + public static function getSubscribedEvents() + { + return [ + PackageEvents::PRE_PACKAGE_INSTALL => 'reorderInstallers', + PackageEvents::PRE_PACKAGE_UPDATE => 'reorderInstallers', + ScriptEvents::POST_AUTOLOAD_DUMP => 'cleanupVendor', + ]; + } + + public function reorderInstallers(PackageEvent $event) + { + $installationManager = $this->composer->getInstallationManager(); + + $ref = new \ReflectionProperty($installationManager, 'installers'); + $ref->setAccessible(true); + $installers = $ref->getValue($installationManager); + + $reordered = []; + foreach ($installers as $installer) { + if ($installer instanceof LibraryInstaller || $installer instanceof PluginInstaller || $installer instanceof PearInstaller) { + array_unshift($reordered, $installer); + } else { + $reordered[] = $installer; + } + } + $ref->setValue($installationManager, $reordered); + } + + public function cleanupVendor(Event $event) + { + $extra = $this->composer->getPackage()->getExtra(); + if (empty($extra['installer-paths'])) { + return; + } + + $vendorDir = $this->composer->getConfig()->get('vendor-dir'); + foreach ($extra['installer-paths'] as $path => $packages) { + foreach ($packages as $package) { + $vendorPath = $vendorDir . '/' . $package; + if (is_dir($vendorPath)) { + $this->removeDirectory($vendorPath); + } + } + } + } + + private function removeDirectory(string $dir): void + { + if (!is_dir($dir)) { + return; + } + $items = new \RecursiveIteratorIterator( + new \RecursiveDirectoryIterator($dir, \FilesystemIterator::SKIP_DOTS), + \RecursiveIteratorIterator::CHILD_FIRST + ); + foreach ($items as $item) { + if ($item->isDir()) { + rmdir($item->getPathname()); + } else { + unlink($item->getPathname()); + } + } + rmdir($dir); + } +} diff --git a/tests/Unit/LifecyclePluginTest.php b/tests/Unit/LifecyclePluginTest.php new file mode 100644 index 0000000..a2f1289 --- /dev/null +++ b/tests/Unit/LifecyclePluginTest.php @@ -0,0 +1,20 @@ +assertArrayHasKey(PackageEvents::PRE_PACKAGE_INSTALL, $events); + $this->assertArrayHasKey(PackageEvents::PRE_PACKAGE_UPDATE, $events); + $this->assertArrayHasKey(ScriptEvents::POST_AUTOLOAD_DUMP, $events); + } +}