InstallCommand.php 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. <?php
  2. /*
  3. * This file is part of Composer.
  4. *
  5. * (c) Nils Adermann <naderman@naderman.de>
  6. * Jordi Boggiano <j.boggiano@seld.be>
  7. *
  8. * For the full copyright and license information, please view the LICENSE
  9. * file that was distributed with this source code.
  10. */
  11. namespace Composer\Command;
  12. use Composer\Autoload\AutoloadGenerator;
  13. use Composer\DependencyResolver;
  14. use Composer\DependencyResolver\Pool;
  15. use Composer\DependencyResolver\Request;
  16. use Composer\DependencyResolver\Operation;
  17. use Composer\Package\LinkConstraint\VersionConstraint;
  18. use Composer\Repository\PlatformRepository;
  19. use Symfony\Component\Console\Input\InputInterface;
  20. use Symfony\Component\Console\Output\OutputInterface;
  21. /**
  22. * @author Jordi Boggiano <j.boggiano@seld.be>
  23. * @author Ryan Weaver <ryan@knplabs.com>
  24. * @author Konstantin Kudryashov <ever.zet@gmail.com>
  25. */
  26. class InstallCommand extends Command
  27. {
  28. protected function configure()
  29. {
  30. $this
  31. ->setName('install')
  32. ->setDescription('Parses the composer.json file and downloads the needed dependencies.')
  33. ->setHelp(<<<EOT
  34. The <info>install</info> command reads the composer.json file from the
  35. current directory, processes it, and downloads and installs all the
  36. libraries and dependencies outlined in that file.
  37. <info>php composer install</info>
  38. EOT
  39. )
  40. ;
  41. }
  42. protected function execute(InputInterface $input, OutputInterface $output)
  43. {
  44. $composer = $this->getComposer();
  45. // creating repository pool
  46. $pool = new Pool;
  47. $pool->addRepository($composer->getRepositoryManager()->getLocalRepository());
  48. foreach ($composer->getRepositoryManager()->getRepositories() as $repository) {
  49. $pool->addRepository($repository);
  50. }
  51. // creating requirements request
  52. $request = new Request($pool);
  53. if ($composer->getLocker()->isLocked()) {
  54. $output->writeln('> Found lockfile. Reading.');
  55. foreach ($composer->getLocker()->getLockedPackages() as $package) {
  56. $constraint = new VersionConstraint('=', $package->getVersion());
  57. $request->install($package->getName(), $constraint);
  58. }
  59. } else {
  60. foreach ($composer->getPackage()->getRequires() as $link) {
  61. $request->install($link->getTarget(), $link->getConstraint());
  62. }
  63. }
  64. // prepare solver
  65. $installationManager = $composer->getInstallationManager();
  66. $localRepo = $composer->getRepositoryManager()->getLocalRepository();
  67. $installedRepo = new PlatformRepository($localRepo);
  68. $policy = new DependencyResolver\DefaultPolicy();
  69. $solver = new DependencyResolver\Solver($policy, $pool, $installedRepo);
  70. // solve dependencies
  71. $operations = $solver->solve($request);
  72. // check for missing deps
  73. // TODO this belongs in the solver, but this will do for now to report top-level deps missing at least
  74. foreach ($request->getJobs() as $job) {
  75. if ('install' === $job['cmd']) {
  76. foreach ($localRepo->getPackages() as $package) {
  77. if ($job['packageName'] === $package->getName()) {
  78. continue 2;
  79. }
  80. }
  81. foreach ($operations as $operation) {
  82. if ('install' === $operation->getJobType() && $job['packageName'] === $operation->getPackage()->getName()) {
  83. continue 2;
  84. }
  85. }
  86. throw new \UnexpectedValueException('Package '.$job['packageName'].' could not be resolved to an installable package.');
  87. }
  88. }
  89. // execute operations
  90. foreach ($operations as $operation) {
  91. $installationManager->execute($operation);
  92. }
  93. if (!$composer->getLocker()->isLocked()) {
  94. $composer->getLocker()->lockPackages($localRepo->getPackages());
  95. $output->writeln('> Locked');
  96. }
  97. $localRepo->write();
  98. $output->writeln('> Generating autoload.php');
  99. $generator = new AutoloadGenerator($localRepo, $composer->getPackage(), $installationManager);
  100. $generator->dump('.composer/autoload.php');
  101. $output->writeln('> Done');
  102. }
  103. }