Эх сурвалжийг харах

Load plugins from global vendor dir too

Nils Adermann 11 жил өмнө
parent
commit
c5c180fdd2

+ 22 - 2
src/Composer/Factory.php

@@ -18,6 +18,7 @@ use Composer\IO\IOInterface;
 use Composer\Package\Archiver;
 use Composer\Package\Archiver;
 use Composer\Repository\ComposerRepository;
 use Composer\Repository\ComposerRepository;
 use Composer\Repository\RepositoryManager;
 use Composer\Repository\RepositoryManager;
+use Composer\Repository\RepositoryInterface;
 use Composer\Util\ProcessExecutor;
 use Composer\Util\ProcessExecutor;
 use Composer\Util\RemoteFilesystem;
 use Composer\Util\RemoteFilesystem;
 use Symfony\Component\Console\Formatter\OutputFormatterStyle;
 use Symfony\Component\Console\Formatter\OutputFormatterStyle;
@@ -252,6 +253,7 @@ class Factory
         $generator = new AutoloadGenerator($dispatcher);
         $generator = new AutoloadGenerator($dispatcher);
         $composer->setAutoloadGenerator($generator);
         $composer->setAutoloadGenerator($generator);
 
 
+        $globalRepository = $this->createGlobalRepository($config, $vendorDir);
         $pm = $this->createPluginManager($composer, $io);
         $pm = $this->createPluginManager($composer, $io);
         $composer->setPluginManager($pm);
         $composer->setPluginManager($pm);
 
 
@@ -306,6 +308,24 @@ class Factory
         $rm->setLocalRepository(new Repository\InstalledFilesystemRepository(new JsonFile($vendorDir.'/composer/installed.json')));
         $rm->setLocalRepository(new Repository\InstalledFilesystemRepository(new JsonFile($vendorDir.'/composer/installed.json')));
     }
     }
 
 
+     /**
+     * @param Config $config
+     * @param string $vendorDir
+     */
+    protected function createGlobalRepository(Config $config, $vendorDir)
+    {
+        if ($config->get('home') == $vendorDir) {
+            return null;
+        }
+
+        $path = $config->get('home').'/vendor/composer/installed.json';
+        if (!file_exists($path)) {
+            return null;
+        }
+
+        return new Repository\InstalledFilesystemRepository(new JsonFile($path));
+    }
+
     /**
     /**
      * @param  IO\IOInterface             $io
      * @param  IO\IOInterface             $io
      * @param  Config                     $config
      * @param  Config                     $config
@@ -367,9 +387,9 @@ class Factory
     /**
     /**
      * @return Plugin\PluginManager
      * @return Plugin\PluginManager
      */
      */
-    protected function createPluginManager(Composer $composer, IOInterface $io)
+    protected function createPluginManager(Composer $composer, IOInterface $io, RepositoryInterface $globalRepository = null)
     {
     {
-        return new Plugin\PluginManager($composer, $io);
+        return new Plugin\PluginManager($composer, $io, $globalRepository);
     }
     }
 
 
     /**
     /**

+ 21 - 7
src/Composer/Plugin/PluginManager.php

@@ -14,8 +14,9 @@ namespace Composer\Plugin;
 
 
 use Composer\Composer;
 use Composer\Composer;
 use Composer\EventDispatcher\EventSubscriberInterface;
 use Composer\EventDispatcher\EventSubscriberInterface;
-use Composer\Package\Package;
 use Composer\IO\IOInterface;
 use Composer\IO\IOInterface;
+use Composer\Package\Package;
+use Composer\Repository\RepositoryInterface;
 use Composer\Package\PackageInterface;
 use Composer\Package\PackageInterface;
 use Composer\Package\Link;
 use Composer\Package\Link;
 use Composer\DependencyResolver\Pool;
 use Composer\DependencyResolver\Pool;
@@ -29,6 +30,7 @@ class PluginManager
 {
 {
     protected $composer;
     protected $composer;
     protected $io;
     protected $io;
+    protected $globalRepository;
 
 
     protected $plugins = array();
     protected $plugins = array();
 
 
@@ -39,10 +41,11 @@ class PluginManager
      *
      *
      * @param Composer $composer
      * @param Composer $composer
      */
      */
-    public function __construct(Composer $composer, IOInterface $io)
+    public function __construct(Composer $composer, IOInterface $io, RepositoryInterface $globalRepository = null)
     {
     {
         $this->composer = $composer;
         $this->composer = $composer;
         $this->io = $io;
         $this->io = $io;
+        $this->globalRepository = $globalRepository;
     }
     }
 
 
     /**
     /**
@@ -53,11 +56,10 @@ class PluginManager
         $repo = $this->composer->getRepositoryManager()->getLocalRepository();
         $repo = $this->composer->getRepositoryManager()->getLocalRepository();
 
 
         if ($repo) {
         if ($repo) {
-            foreach ($repo->getPackages() as $package) {
-                if ('composer-plugin' === $package->getType() || 'composer-installer' === $package->getType()) {
-                    $this->registerPackage($package);
-                }
-            }
+            $this->loadRepository($repo);
+        }
+        if ($this->globalRepository) {
+            $this->loadRepository($this->globalRepository);
         }
         }
     }
     }
 
 
@@ -86,6 +88,15 @@ class PluginManager
         return $this->plugins;
         return $this->plugins;
     }
     }
 
 
+    protected function loadRepository(RepositoryInterface $repo)
+    {
+        foreach ($repo->getPackages() as $package) {
+            if ('composer-plugin' === $package->getType() || 'composer-installer' === $package->getType()) {
+                $this->registerPackage($package);
+            }
+        }
+    }
+
     /**
     /**
      * Recursively generates a map of package names to packages for all deps
      * Recursively generates a map of package names to packages for all deps
      *
      *
@@ -150,6 +161,9 @@ class PluginManager
 
 
         $pool = new Pool('dev');
         $pool = new Pool('dev');
         $pool->addRepository($this->composer->getRepositoryManager()->getLocalRepository());
         $pool->addRepository($this->composer->getRepositoryManager()->getLocalRepository());
+        if ($this->globalRepository) {
+            $pool->addRepository($this->globalRepository);
+        }
 
 
         $autoloadPackages = array($package->getName() => $package);
         $autoloadPackages = array($package->getName() => $package);
         $autoloadPackages = $this->collectDependencies($pool, $autoloadPackages, $package);
         $autoloadPackages = $this->collectDependencies($pool, $autoloadPackages, $package);