Browse Source

Delay bootstrap until it's really necessary, fixes #121

Jordi Boggiano 13 years ago
parent
commit
94e277698e
2 changed files with 94 additions and 74 deletions
  1. 2 70
      bin/composer
  2. 92 4
      src/Composer/Console/Application.php

+ 2 - 70
bin/composer

@@ -8,76 +8,8 @@ php composer.phar install
 ');
 }
 
-use Composer\Composer;
-use Composer\Installer;
-use Composer\Downloader;
-use Composer\Repository;
-use Composer\Package;
-use Composer\Json\JsonFile;
-use Composer\Console\Application as ComposerApplication;
-
-// load Composer configuration
-$file = new JsonFile('composer.json');
-if (!$file->exists()) {
-    echo 'Composer could not find a composer.json file in '.getcwd().PHP_EOL;
-    echo 'To initialize a project, please create a composer.json file as described on the http://packagist.org/ "Getting Started" section'.PHP_EOL;
-    exit(1);
-}
-
-// Configuration defaults
-$composerConfig = array('vendor-dir' => 'vendor');
-
-$packageConfig = $file->read();
-
-if (isset($packageConfig['config']) && is_array($packageConfig['config'])) {
-    $packageConfig['config'] = array_merge($composerConfig, $packageConfig['config']);
-} else {
-    $packageConfig['config'] = $composerConfig;
-}
-
-$vendorDir = $packageConfig['config']['vendor-dir'];
-
-// initialize repository manager
-$rm = new Repository\RepositoryManager();
-$rm->setLocalRepository(new Repository\FilesystemRepository(new JsonFile($vendorDir.'/.composer/installed.json')));
-$rm->setRepositoryClass('composer', 'Composer\Repository\ComposerRepository');
-$rm->setRepositoryClass('vcs', 'Composer\Repository\VcsRepository');
-$rm->setRepositoryClass('pear', 'Composer\Repository\PearRepository');
-$rm->setRepositoryClass('package', 'Composer\Repository\PackageRepository');
-
-// initialize download manager
-$dm = new Downloader\DownloadManager();
-$dm->setDownloader('git',  new Downloader\GitDownloader());
-$dm->setDownloader('svn',  new Downloader\SvnDownloader());
-$dm->setDownloader('hg', new Downloader\HgDownloader());
-$dm->setDownloader('pear', new Downloader\PearDownloader());
-$dm->setDownloader('zip',  new Downloader\ZipDownloader());
-
-// initialize installation manager
-$im = new Installer\InstallationManager($vendorDir);
-$im->addInstaller(new Installer\LibraryInstaller($vendorDir, $dm, $rm->getLocalRepository(), null));
-$im->addInstaller(new Installer\InstallerInstaller($vendorDir, $dm, $rm->getLocalRepository(), $im));
-
-// load package
-$loader  = new Package\Loader\ArrayLoader($rm);
-$package = $loader->load($packageConfig);
-
-// load default repository unless it's explicitly disabled
-if (!isset($packageConfig['repositories']['packagist']) || $packageConfig['repositories']['packagist'] !== false) {
-    $rm->addRepository(new Repository\ComposerRepository('http://packagist.org'));
-}
-
-// init locker
-$locker = new Package\Locker(new JsonFile('composer.lock'), $rm);
-
-// initialize composer
-$composer = new Composer();
-$composer->setPackage($package);
-$composer->setLocker($locker);
-$composer->setRepositoryManager($rm);
-$composer->setDownloadManager($dm);
-$composer->setInstallationManager($im);
+use Composer\Console\Application;
 
 // run the command application
-$application = new ComposerApplication($composer);
+$application = new Application();
 $application->run();

+ 92 - 4
src/Composer/Console/Application.php

@@ -18,21 +18,25 @@ use Symfony\Component\Console\Output\OutputInterface;
 use Symfony\Component\Finder\Finder;
 use Composer\Command;
 use Composer\Composer;
+use Composer\Installer;
+use Composer\Downloader;
+use Composer\Repository;
+use Composer\Package;
+use Composer\Json\JsonFile;
 
 /**
  * The console application that handles the commands
  *
  * @author Ryan Weaver <ryan@knplabs.com>
+ * @author Jordi Boggiano <j.boggiano@seld.be>
  */
 class Application extends BaseApplication
 {
-    private $composer;
+    protected $composer;
 
-    public function __construct(Composer $composer)
+    public function __construct()
     {
         parent::__construct('Composer', Composer::VERSION);
-
-        $this->composer = $composer;
     }
 
     /**
@@ -55,9 +59,93 @@ class Application extends BaseApplication
      */
     public function getComposer()
     {
+        if (null === $this->composer) {
+            $this->composer = self::bootstrapComposer();
+        }
+
         return $this->composer;
     }
 
+    /**
+     * Bootstraps a Composer instance
+     *
+     * @return Composer
+     */
+    public static function bootstrapComposer($composerFile = null)
+    {
+        // load Composer configuration
+        if (null === $composerFile) {
+            $composerFile = 'composer.json';
+        }
+
+        $file = new JsonFile($composerFile);
+        if (!$file->exists()) {
+            if ($composerFile === 'composer.json') {
+                echo 'Composer could not find a composer.json file in '.getcwd().PHP_EOL;
+            } else {
+                echo 'Composer could not find the config file: '.$composerFile.PHP_EOL;
+            }
+            echo 'To initialize a project, please create a composer.json file as described on the http://packagist.org/ "Getting Started" section'.PHP_EOL;
+            exit(1);
+        }
+
+        // Configuration defaults
+        $composerConfig = array('vendor-dir' => 'vendor');
+
+        $packageConfig = $file->read();
+
+        if (isset($packageConfig['config']) && is_array($packageConfig['config'])) {
+            $packageConfig['config'] = array_merge($composerConfig, $packageConfig['config']);
+        } else {
+            $packageConfig['config'] = $composerConfig;
+        }
+
+        $vendorDir = $packageConfig['config']['vendor-dir'];
+
+        // initialize repository manager
+        $rm = new Repository\RepositoryManager();
+        $rm->setLocalRepository(new Repository\FilesystemRepository(new JsonFile($vendorDir.'/.composer/installed.json')));
+        $rm->setRepositoryClass('composer', 'Composer\Repository\ComposerRepository');
+        $rm->setRepositoryClass('vcs', 'Composer\Repository\VcsRepository');
+        $rm->setRepositoryClass('pear', 'Composer\Repository\PearRepository');
+        $rm->setRepositoryClass('package', 'Composer\Repository\PackageRepository');
+
+        // initialize download manager
+        $dm = new Downloader\DownloadManager();
+        $dm->setDownloader('git',  new Downloader\GitDownloader());
+        $dm->setDownloader('svn',  new Downloader\SvnDownloader());
+        $dm->setDownloader('hg', new Downloader\HgDownloader());
+        $dm->setDownloader('pear', new Downloader\PearDownloader());
+        $dm->setDownloader('zip',  new Downloader\ZipDownloader());
+
+        // initialize installation manager
+        $im = new Installer\InstallationManager($vendorDir);
+        $im->addInstaller(new Installer\LibraryInstaller($vendorDir, $dm, $rm->getLocalRepository(), null));
+        $im->addInstaller(new Installer\InstallerInstaller($vendorDir, $dm, $rm->getLocalRepository(), $im));
+
+        // load package
+        $loader  = new Package\Loader\ArrayLoader($rm);
+        $package = $loader->load($packageConfig);
+
+        // load default repository unless it's explicitly disabled
+        if (!isset($packageConfig['repositories']['packagist']) || $packageConfig['repositories']['packagist'] !== false) {
+            $rm->addRepository(new Repository\ComposerRepository('http://packagist.org'));
+        }
+
+        // init locker
+        $locker = new Package\Locker(new JsonFile('composer.lock'), $rm);
+
+        // initialize composer
+        $composer = new Composer();
+        $composer->setPackage($package);
+        $composer->setLocker($locker);
+        $composer->setRepositoryManager($rm);
+        $composer->setDownloadManager($dm);
+        $composer->setInstallationManager($im);
+
+        return $composer;
+    }
+
     /**
      * Initializes all the composer commands
      */