public static function install(Event $event)
{
$io = $event->getIO();
$composer = $event->getComposer();
// Get composer.json
$composerFile = Factory::getComposerFile();
$json = new JsonFile($composerFile);
self::$composerDefinition = $json->read();
self::$projectRoot = realpath(dirname($composerFile));
$io->write("<info>Setup data and cache dir</info>");
if (!is_dir(self::$projectRoot . '/data/cache')) {
mkdir(self::$projectRoot . '/data/cache', 0775, true);
chmod(self::$projectRoot . '/data', 0775);
}
$io->write("<info>Setting up optional packages</info>");
// Get root package
$rootPackage = $composer->getPackage();
while ($rootPackage instanceof AliasPackage) {
$rootPackage = $rootPackage->getAliasOf();
}
// Get required packages
self::$composerRequires = $rootPackage->getRequires();
self::$composerDevRequires = $rootPackage->getDevRequires();
// Get stability flags
self::$stabilityFlags = $rootPackage->getStabilityFlags();
// Cleanup development dependencies
self::removeDevDependencies();
// Minimal?
$minimal = self::requestMinimal($io);
$copyFilesKey = $minimal ? 'minimal-files' : 'copy-files';
self::$config = (require __DIR__ . '/config.php');
foreach (self::$config['questions'] as $questionName => $question) {
$defaultOption = isset($question['default']) ? $question['default'] : 1;
if (isset(self::$composerDefinition['extra']['optional-packages'][$questionName])) {
// Skip question, it's already answered
continue;
}
// Get answer
$answer = self::askQuestion($composer, $io, $question, $defaultOption);
// Process answer
self::processAnswer($io, $question, $answer, $copyFilesKey);
// Save user selected option
self::$composerDefinition['extra']['optional-packages'][$questionName] = $answer;
// Update composer definition
$json->write(self::$composerDefinition);
}
// Set required packages
$rootPackage->setRequires(self::$composerRequires);
$rootPackage->setDevRequires(self::$composerDevRequires);
// Set stability flags
$rootPackage->setStabilityFlags(self::$stabilityFlags);
// House keeping
$io->write("<info>Remove installer</info>");
self::removeInstallerFromDefinition();
// Update composer definition
$json->write(self::$composerDefinition);
// Minimal install? Remove default middleware
if ($minimal) {
self::removeDefaultMiddleware($io, self::$projectRoot);
}
self::clearComposerLockFile($io, self::$projectRoot);
self::cleanUp($io, self::$projectRoot);
}