public function build($rootDirectory, $optimize = false, $noDevMode = false) { $this->io->write(sprintf('<info>Generating autoload files for monorepo sub-packages %s dev-dependencies.</info>', $noDevMode ? 'without' : 'with')); $start = microtime(true); $packages = $this->loadPackages($rootDirectory); $evm = new EventDispatcher(new Composer(), $this->io); $generator = new AutoloadGenerator($evm, $this->io); $generator->setDevMode(!$noDevMode); $installationManager = new InstallationManager(); $installationManager->addInstaller(new MonorepoInstaller()); foreach ($packages as $packageName => $config) { if (strpos($packageName, 'vendor') === 0) { continue; } $this->io->write(sprintf(' [Subpackage] <comment>%s</comment>', $packageName)); $mainPackage = new Package($packageName, "@stable", "@stable"); $mainPackage->setType('monorepo'); $mainPackage->setAutoload($config['autoload']); $mainPackage->setDevAutoload($config['autoload-dev']); $localRepo = new MonorepoInstalledRepository(); $this->resolvePackageDependencies($localRepo, $packages, $packageName); $composerConfig = new Config(true, $rootDirectory); $composerConfig->merge(array('config' => array('vendor-dir' => $config['path'] . '/vendor'))); $generator->dump($composerConfig, $localRepo, $mainPackage, $installationManager, 'composer', $optimize); $binDir = $config['path'] . '/vendor/bin'; // remove old symlinks array_map('unlink', glob($binDir . '/*')); foreach ($localRepo->getPackages() as $package) { foreach ($package->getBinaries() as $binary) { if (!is_dir($binDir)) { mkdir($binDir, 0755, true); } $binFile = $binDir . '/' . basename($binary); symlink($rootDirectory . '/' . $binary, $binFile); } } } $duration = microtime(true) - $start; $this->io->write(sprintf('Monorepo subpackage autoloads generated in <comment>%0.2f</comment> seconds.', $duration)); }