Browse Source

Always set bin-dir into PATH before calling scripts, fixes #4852, closes #4898

Jordi Boggiano 9 years ago
parent
commit
2609cfdd1d

+ 0 - 7
src/Composer/Command/RunScriptCommand.php

@@ -84,13 +84,6 @@ EOT
             throw new \InvalidArgumentException(sprintf('Script "%s" is not defined in this package', $script));
         }
 
-        // add the bin dir to the PATH to make local binaries of deps usable in scripts
-        $binDir = $composer->getConfig()->get('bin-dir');
-        if (is_dir($binDir)) {
-            $_SERVER['PATH'] = realpath($binDir).PATH_SEPARATOR.getenv('PATH');
-            putenv('PATH='.$_SERVER['PATH']);
-        }
-
         $args = $input->getArgument('args');
 
         return $composer->getEventDispatcher()->dispatchScript($script, $input->getOption('dev') || !$input->getOption('no-dev'), $args);

+ 0 - 7
src/Composer/Command/ScriptAliasCommand.php

@@ -54,13 +54,6 @@ EOT
     {
         $composer = $this->getComposer();
 
-        // add the bin dir to the PATH to make local binaries of deps usable in scripts
-        $binDir = $composer->getConfig()->get('bin-dir');
-        if (is_dir($binDir)) {
-            $_SERVER['PATH'] = realpath($binDir).PATH_SEPARATOR.getenv('PATH');
-            putenv('PATH='.$_SERVER['PATH']);
-        }
-
         $args = $input->getArguments();
 
         return $composer->getEventDispatcher()->dispatchScript($this->script, $input->getOption('dev') || !$input->getOption('no-dev'), $args['args']);

+ 10 - 0
src/Composer/EventDispatcher/EventDispatcher.php

@@ -145,6 +145,16 @@ class EventDispatcher
      */
     protected function doDispatch(Event $event)
     {
+        // add the bin dir to the PATH to make local binaries of deps usable in scripts
+        $binDir = $this->composer->getConfig()->get('bin-dir');
+        if (is_dir($binDir)) {
+            $binDir = realpath($binDir);
+            if (isset($_SERVER['PATH']) && !preg_match('{(^|'.PATH_SEPARATOR.')'.preg_quote($binDir).'($|'.PATH_SEPARATOR.')}', $_SERVER['PATH'])) {
+                $_SERVER['PATH'] = $binDir.PATH_SEPARATOR.getenv('PATH');
+                putenv('PATH='.$_SERVER['PATH']);
+            }
+        }
+
         $listeners = $this->getListeners($event);
 
         $this->pushEvent($event);