This repository has been archived on 2025-08-17. You can view files and clone it, but you cannot make any changes to it's state, such as pushing and creating new issues, pull requests or comments.
versa/src/Console/Command/BuildCommand.php

81 lines
2.9 KiB
PHP
Raw Normal View History

2024-02-21 12:48:33 +00:00
<?php
namespace App\Console\Command;
use App\Enum\ProjectType;
use App\Process\Process;
use RuntimeException;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Filesystem\Filesystem;
final class BuildCommand extends AbstractCommand
{
public function execute(InputInterface $input, OutputInterface $output): int
{
$projectType = null;
$extraArgs = $input->getOption('extra-args');
$workingDir = $input->getOption('working-dir');
2024-02-21 12:48:33 +00:00
$filesystem = new Filesystem();
// Attempt to prepopulate some of the options, such as the project type
// based on its dependencies.
// TODO: move this logic to a service so it can be tested.
if ($filesystem->exists($workingDir.'/composer.json')) {
2024-02-21 12:48:33 +00:00
$json = json_decode(
json: strval(file_get_contents($workingDir.'/composer.json')),
2024-02-21 12:48:33 +00:00
associative: true,
);
$dependencies = array_keys($json['require']);
if (in_array(needle: 'drupal/core', haystack: $dependencies, strict: true) || in_array(needle: 'drupal/core-recommended', haystack: $dependencies, strict: true)) {
$projectType = ProjectType::Drupal->value;
} elseif (in_array(needle: 'sculpin/sculpin', haystack: $dependencies, strict: true)) {
$projectType = ProjectType::Sculpin->value;
} elseif (in_array(needle: 'symfony/framework-bundle', haystack: $dependencies, strict: true)) {
$projectType = ProjectType::Symfony->value;
}
}
// Even if the project type is found automatically, still override it with
// the option value if there is one.
$projectType = $input->getOption('type') ?? $projectType;
$isDockerCompose = $filesystem->exists($workingDir . '/docker-compose.yaml');
2024-02-21 12:48:33 +00:00
switch ($projectType) {
case ProjectType::Drupal->value:
if ($isDockerCompose) {
$process = Process::create(
command: ['docker', 'compose', 'build'],
extraArgs: $extraArgs,
workingDir: $workingDir,
2024-02-21 12:48:33 +00:00
);
$process->run();
}
break;
case ProjectType::Symfony->value:
// TODO: run humbug/box if added to generate a phar?
throw new RuntimeException('No build command set for Symfony projects.');
case ProjectType::Sculpin->value:
$process = Process::create(
command: ['./vendor/bin/sculpin', 'generate'],
extraArgs: $extraArgs,
workingDir: $workingDir,
2024-02-21 12:48:33 +00:00
);
$process->run();
break;
}
return Command::SUCCESS;
}
}