Procházet zdrojové kódy

Register all packages via the autoload generator before dispatching events

Jordi Boggiano před 13 roky
rodič
revize
2d780fbef6
1 změnil soubory, kde provedl 15 přidání a 11 odebrání
  1. 15 11
      src/Composer/Script/EventDispatcher.php

+ 15 - 11
src/Composer/Script/EventDispatcher.php

@@ -14,7 +14,7 @@ namespace Composer\Script;
 
 use Composer\Json\JsonFile;
 use Composer\Repository\FilesystemRepository;
-use Composer\Autoload\ClassLoader;
+use Composer\Autoload\AutoloadGenerator;
 use Composer\Package\PackageInterface;
 use Composer\IO\IOInterface;
 use Composer\Composer;
@@ -48,8 +48,6 @@ class EventDispatcher
     {
         $this->composer = $composer;
         $this->io = $io;
-        $this->loader = new ClassLoader();
-        $this->loader->register();
     }
 
     /**
@@ -105,16 +103,22 @@ class EventDispatcher
     {
         $package = $this->composer->getPackage();
         $scripts = $package->getScripts();
-        $autoload = $package->getAutoload();
 
-        // get namespaces in composer.json project
-        if (!$this->loader->getPrefixes() && isset($autoload['psr-0'])) {
-            krsort($autoload['psr-0']);
-            foreach ($autoload['psr-0'] as $ns => $path) {
-                $this->loader->add($ns, rtrim(getcwd().'/'.$path, '/'));
-            }
+        if (empty($scripts[$event->getName()])) {
+            return array();
+        }
+
+        if ($this->loader) {
+            $this->loader->unregister();
         }
 
-        return isset($scripts[$event->getName()]) ? $scripts[$event->getName()] : array();
+        $generator = new AutoloadGenerator;
+        $packages = $this->composer->getRepositoryManager()->getLocalRepository()->getPackages();
+        $packageMap = $generator->buildPackageMap($this->composer->getInstallationManager(), $package, $packages);
+        $map = $generator->parseAutoloads($packageMap);
+        $this->loader = $generator->createLoader($map);
+        $this->loader->register();
+
+        return $scripts[$event->getName()];
     }
 }