Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

✨ Add acorn:install command to simplify installing Acorn #369

Merged
merged 5 commits into from
Apr 2, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
131 changes: 131 additions & 0 deletions src/Roots/Acorn/Console/Commands/AcornInstallCommand.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,131 @@
<?php

namespace Roots\Acorn\Console\Commands;

use Composer\InstalledVersions;

use function Laravel\Prompts\confirm;

class AcornInstallCommand extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'acorn:install
{--autoload : Install the Acorn autoload dump script}
{--init : Initialize Acorn}';

/**
* The console command description.
*
* @var string
*/
protected $description = 'Install Acorn into the application';

/**
* Execute the console command.
*/
public function handle(): int
{
$this->askToInstallScript();
$this->askToInitialize();
$this->askToStar();

return static::SUCCESS;
}

/**
* Ask to install the Acorn autoload dump script.
*/
protected function askToInstallScript(): void
{
if (! $this->option('autoload') && $this->option('no-interaction')) {
return;
}

if ($this->option('autoload') || confirm(
label: 'Would you like to install the Acorn autoload dump script?',
default: true,
)) {
$this->installAutoloadDump();
}
}

/**
* Install the Acorn autoload dump script.
*/
protected function installAutoloadDump(): void
{
$path = InstalledVersions::getInstallPath('roots/acorn');
$path = dirname($path, 5);

$composer = "{$path}/composer.json";

if (! file_exists($composer)) {
return;
}

$configuration = json_decode(file_get_contents($composer), associative: true);

$script = 'Roots\\Acorn\\ComposerScripts::postAutoloadDump';

if (in_array($script, $configuration['scripts']['post-autoload-dump'] ?? [])) {
return;
}

$configuration['scripts']['post-autoload-dump'] ??= [];
$configuration['scripts']['post-autoload-dump'][] = $script;

$configuration = str(json_encode($configuration, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES))
->replace(' ', ' ')
->append(PHP_EOL)
->toString();

file_put_contents(
$composer,
$configuration,
);
}

/**
* Ask the user to initialize Acorn.
*/
protected function askToInitialize(): void
{
if (! $this->option('init') && $this->option('no-interaction')) {
return;
}

if ($this->option('init') || confirm(
label: 'Would you like to initialize Acorn?',
default: true,
)) {
$this->callSilent('acorn:init', ['--base' => $this->getLaravel()->basePath()]);
}
}

/**
* Ask the user to star the Acorn repository.
*/
protected function askToStar(): void
{
if ($this->option('no-interaction')) {
return;
}

if (confirm(
label: '🎉 All done! Would you like to show love by starring Acorn on GitHub?',
default: true,
)) {
match (PHP_OS_FAMILY) {
'Darwin' => exec('open https://github.com/roots/acorn'),
'Linux' => exec('xdg-open https://github.com/roots/acorn'),
'Windows' => exec('start https://github.com/roots/acorn'),
};

$this->components->info('Thank you!');
}
}
}
1 change: 1 addition & 0 deletions src/Roots/Acorn/Console/Kernel.php
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ class Kernel extends FoundationConsoleKernel
\Illuminate\Routing\Console\MiddlewareMakeCommand::class,
\Roots\Acorn\Console\Commands\AboutCommand::class,
\Roots\Acorn\Console\Commands\AcornInitCommand::class,
\Roots\Acorn\Console\Commands\AcornInstallCommand::class,
\Roots\Acorn\Console\Commands\ComposerMakeCommand::class,
\Roots\Acorn\Console\Commands\ConfigCacheCommand::class,
\Roots\Acorn\Console\Commands\KeyGenerateCommand::class,
Expand Down