Przeglądaj źródła

Add a command for adding package to composer.json

Updated doc for require command
Jérémy Romey 13 lat temu
rodzic
commit
260d7d434f

+ 13 - 1
doc/03-cli.md

@@ -62,6 +62,18 @@ into `composer.lock`.
 * **--no-install-recommends:** Do not install packages referenced by `recommend`.
 * **--install-suggests:** Install packages referenced by `suggest`.
 
+## require
+
+The `require` command adds new packages to the `composer.json` file from the current
+directory.
+
+    $ php composer.phar require
+
+This will update your `composer.json` file keeping previous required packages.
+If a package is already in the `composer.json` file you will be asked to choose which version you want.
+
+Like the `init` command, `require` allows you to search for packages.
+
 ## search
 
 The search command allows you to search through the current project's package
@@ -190,4 +202,4 @@ some tools like git or curl will only use the lower-cased `http_proxy` version.
 Alternatively you can also define the git proxy using
 `git config --global http.proxy <proxy url>`.
 
-&larr; [Libraries](02-libraries.md)  |  [Schema](04-schema.md) &rarr;
+&larr; [Libraries](02-libraries.md)  |  [Schema](04-schema.md) &rarr;

+ 110 - 0
src/Composer/Command/RequireCommand.php

@@ -0,0 +1,110 @@
+<?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 Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\OutputInterface;
+use Composer\Json\JsonFile;
+use Composer\Json\JsonValidationException;
+use Composer\Util\RemoteFilesystem;
+
+/**
+ * @author Jérémy Romey <jeremy@free-agent.fr>
+ */
+class RequireCommand extends InitCommand
+{
+    protected function configure()
+    {
+        $this
+            ->setName('require')
+            ->setDescription('Adds a required package to a composer.json')
+            ->setDefinition(array(
+                new InputArgument('file', InputArgument::OPTIONAL, 'path to composer.json file', './composer.json'),
+                new InputOption('require', null, InputOption::VALUE_IS_ARRAY | InputOption::VALUE_REQUIRED, 'An array of required packages'),
+            ))
+            ->setHelp(<<<EOT
+The add package command adds a required package to a given composer.json
+
+EOT
+            )
+        ;
+    }
+
+    protected function execute(InputInterface $input, OutputInterface $output)
+    {
+        $file = $input->getArgument('file');
+
+        if (!file_exists($file)) {
+            $output->writeln('<error>'.$file.' not found.</error>');
+            return 1;
+        }
+        if (!is_readable($file)) {
+            $output->writeln('<error>'.$file.' is not readable.</error>');
+            return 1;
+        }
+
+        $laxValid = false;
+        try {
+            $json = new JsonFile($file, new RemoteFilesystem($this->getIO()));
+            $json->read();
+
+            $json->validateSchema(JsonFile::LAX_SCHEMA);
+            $laxValid = true;
+            $json->validateSchema();
+
+        } catch (\Exception $e) {
+            $output->writeln('<error>'.$file.' has an error. Run the validate command for more info</error>');
+            return 1;
+        }
+
+        $output->writeln(array(
+            '',
+            'Updating your dependencies.',
+            ''
+        ));
+
+        $dialog = $this->getHelperSet()->get('dialog');
+
+        $options = json_decode($json->getResult(), true);
+
+        $requirements = array();
+        $requirements = $this->determineRequirements($input, $output);
+
+        $baseRequirements = array_key_exists('require', $options) ? $options['require'] : array();
+        $requirements     = $this->formatRequirements($requirements);
+
+        foreach ($requirements as $package => $version) {
+            if (array_key_exists($package, $baseRequirements)) {
+                if ($dialog->askConfirmation($output, $dialog->getQuestion('The package '.$package.' is already in requirements. Would you like to update the version required from '.$baseRequirements[$package].' to '.$version, 'yes', '?'), true)) {
+                    $baseRequirements[$package] = $version;
+                }
+            } else {
+                $baseRequirements[$package] = $version;
+            }
+        }
+
+        $options['require'] = $baseRequirements;
+
+        $json->encode($options);
+        $json->write($options);
+
+        $output->writeln('<info>'.$file.' has been updated</info>');
+    }
+
+    protected function interact(InputInterface $input, OutputInterface $output)
+    {
+        return;
+    }
+}

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

@@ -113,6 +113,7 @@ class Application extends BaseApplication
         $this->add(new Command\SearchCommand());
         $this->add(new Command\ValidateCommand());
         $this->add(new Command\ShowCommand());
+        $this->add(new Command\RequireCommand());
 
         if ('phar:' === substr(__FILE__, 0, 5)) {
             $this->add(new Command\SelfUpdateCommand());

+ 10 - 0
src/Composer/Json/JsonFile.php

@@ -293,4 +293,14 @@ class JsonFile
 
         throw $result;
     }
+
+    /**
+     * Returns the content of the file
+     *
+     * @return string result
+     */
+    public function getResult()
+    {
+        return $this->rfs->getContents($this->path, $this->path, false);
+    }
 }