/**
  * @override \ComponentManager\Step\Step
  *
  * @param \ComponentManager\Task\InstallTask $task
  */
 public function execute($task, LoggerInterface $logger)
 {
     $componentSpecifications = $this->project->getProjectFile()->getComponentSpecifications();
     foreach ($componentSpecifications as $componentSpecification) {
         $packageRepository = $this->project->getPackageRepository($componentSpecification->getPackageRepository());
         $logger->info('Resolving component version', ['component' => $componentSpecification->getName(), 'packageRepository' => $componentSpecification->getPackageRepository(), 'version' => $componentSpecification->getVersion()]);
         $componentName = $componentSpecification->getName();
         $componentVersion = $componentSpecification->getVersion();
         $packageRepositoryName = $componentSpecification->getPackageRepository();
         if (!($component = $packageRepository->getComponent($componentSpecification))) {
             throw new InvalidProjectException("The component \"{$componentName}\" could not be found within repository \"{$packageRepositoryName}\"", InvalidProjectException::CODE_MISSING_COMPONENT);
         }
         /* Note that even at this late stage, we still might not have a final
          * version for the component:
          * -> If the package repository provides us with the Moodle
          *    $plugin->version value, we'll be using it here.
          * -> If the package repository is a version control system, the version
          *    will contain the name of a branch or tag and will need to be
          *    resolved to an individual commit. */
         $version = $component->getVersion($componentVersion);
         $task->addResolvedComponentVersion(new ResolvedComponentVersion($componentSpecification, $packageRepository, $component, $version));
     }
 }