Browse Source

Add global command to be able to require/install/update global packages, fixes #1813, fixes #55

Jordi Boggiano 11 years ago
parent
commit
7311bc77e6
2 changed files with 80 additions and 0 deletions
  1. 79 0
      src/Composer/Command/GlobalCommand.php
  2. 1 0
      src/Composer/Console/Application.php

+ 79 - 0
src/Composer/Command/GlobalCommand.php

@@ -0,0 +1,79 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Command;
+
+use Composer\Installer;
+use Composer\Factory;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\StringInput;
+use Symfony\Component\Console\Output\OutputInterface;
+
+/**
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ */
+class GlobalCommand extends Command
+{
+    protected function configure()
+    {
+        $this
+            ->setName('global')
+            ->setDescription('Allows running commands in the global composer dir ($COMPOSER_HOME).')
+            ->setDefinition(array(
+                new InputArgument('command-name', InputArgument::REQUIRED, ''),
+                new InputArgument('args', InputArgument::IS_ARRAY | InputArgument::OPTIONAL, ''),
+            ))
+            ->setHelp(<<<EOT
+Use this command as a wrapper to run other Composer commands
+within the global context of COMPOSER_HOME.
+
+You can use this to install CLI utilities globally, all you need
+is to add the COMPOSER_HOME/vendor/bin dir to your PATH env var.
+
+COMPOSER_HOME is c:\Users\<user>\AppData\Roaming\Composer on Windows
+and /home/<user>/.composer on unix systems.
+
+EOT
+            )
+        ;
+    }
+
+    public function run(InputInterface $input, OutputInterface $output)
+    {
+        // extract real command name
+        $tokens = preg_split('{\s+}', $input->__toString());
+        $args = array();
+        foreach ($tokens as $token) {
+            if ($token && $token[0] !== '-') {
+                $args[] = $token;
+                if (count($args) >= 2) {
+                    break;
+                }
+            }
+        }
+
+        // show help for this command if no command was found
+        if (count($args) < 2) {
+            return parent::run($input, $output);
+        }
+
+        // change to global dir
+        $config = Factory::createConfig();
+        chdir($config->get('home'));
+
+        // create new input without "global" command prefix
+        $input = new StringInput(preg_replace('{\bg(?:l(?:o(?:b(?:a(?:l)?)?)?)?)?\b}', '', $input->__toString(), 1));
+
+        return $this->getApplication()->get($args[1])->run($input, $output);
+    }
+}

+ 1 - 0
src/Composer/Console/Application.php

@@ -225,6 +225,7 @@ class Application extends BaseApplication
         $commands[] = new Command\DiagnoseCommand();
         $commands[] = new Command\RunScriptCommand();
         $commands[] = new Command\LicensesCommand();
+        $commands[] = new Command\GlobalCommand();
 
         if ('phar:' === substr(__FILE__, 0, 5)) {
             $commands[] = new Command\SelfUpdateCommand();