v7.0.0-beta.1 release

This commit is contained in:
HeuJung
2026-04-01 10:30:52 +09:00
commit 6595fd0eb5
3967 changed files with 1875383 additions and 0 deletions
@@ -0,0 +1,184 @@
<?php
namespace App\Console\Commands\Module;
use App\Contracts\Repositories\ModuleRepositoryInterface;
use App\Extension\ExtensionManager;
use App\Extension\ModuleManager;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Log;
class ComposerInstallModuleCommand extends Command
{
/**
* The name and signature of the console command.
*/
protected $signature = 'module:composer-install
{identifier? : Composer 의존성을 설치할 모듈 식별자 (생략 시 --all 필요)}
{--all : 모든 모듈의 Composer 의존성 설치}
{--no-dev : dev 의존성 제외}';
/**
* The console command description.
*/
protected $description = '모듈의 Composer 의존성을 설치합니다';
/**
* 모듈 관리자 및 리포지토리
*/
public function __construct(
private ModuleManager $moduleManager,
private ExtensionManager $extensionManager,
private ModuleRepositoryInterface $moduleRepository
) {
parent::__construct();
}
/**
* Execute the console command.
*/
public function handle(): int
{
$identifier = $this->argument('identifier');
$installAll = $this->option('all');
$noDev = $this->option('no-dev');
if (! $identifier && ! $installAll) {
$this->error('❌ 모듈 식별자를 지정하거나 --all 옵션을 사용하세요.');
$this->line('');
$this->line('사용법:');
$this->line(' php artisan module:composer-install sirsoft-ecommerce');
$this->line(' php artisan module:composer-install --all');
$this->line(' php artisan module:composer-install --all --no-dev');
return Command::FAILURE;
}
try {
$this->moduleManager->loadModules();
if ($installAll) {
return $this->installAllModules($noDev);
}
return $this->installModule($identifier, $noDev);
} catch (\Exception $e) {
$this->error('❌ '.$e->getMessage());
Log::error('모듈 Composer 의존성 설치 실패', [
'module' => $identifier ?? 'all',
'error' => $e->getMessage(),
]);
return Command::FAILURE;
}
}
/**
* 단일 모듈의 Composer 의존성 설치
*
* @param string $identifier 모듈 식별자
* @param bool $noDev dev 의존성 제외 여부
* @return int 커맨드 결과 코드
*/
private function installModule(string $identifier, bool $noDev): int
{
$module = $this->moduleManager->getModule($identifier);
if (! $module) {
$this->error('❌ '.__('modules.errors.not_found', ['module' => $identifier]));
return Command::FAILURE;
}
if (! $this->extensionManager->hasComposerDependencies('modules', $identifier)) {
$this->info('ℹ️ '.__('modules.composer_install.no_dependencies', ['module' => $identifier]));
return Command::SUCCESS;
}
$deps = $this->extensionManager->getComposerDependencies('modules', $identifier);
$this->info('📦 '.__('modules.composer_install.start', ['module' => $identifier]));
$this->line(' '.implode(', ', array_keys($deps)));
$result = $this->extensionManager->runComposerInstall('modules', $identifier, $noDev, $this);
if ($result) {
$this->info('✅ '.__('modules.composer_install.success', ['module' => $identifier]));
// 오토로드 갱신
$this->extensionManager->updateComposerAutoload();
$this->line(' 오토로드 캐시 갱신 완료');
return Command::SUCCESS;
}
$this->error('❌ '.__('modules.composer_install.failed', ['module' => $identifier]));
return Command::FAILURE;
}
/**
* 모든 모듈의 Composer 의존성 설치
*
* @param bool $noDev dev 의존성 제외 여부
* @return int 커맨드 결과 코드
*/
private function installAllModules(bool $noDev): int
{
$modules = $this->moduleManager->getAllModules();
if (empty($modules)) {
$this->warn('⚠️ 설치된 모듈이 없습니다.');
return Command::SUCCESS;
}
// 중복 패키지 감지
$duplicates = $this->extensionManager->detectDuplicatePackages();
if (! empty($duplicates)) {
$this->warn('⚠️ 중복 패키지 감지:');
foreach ($duplicates as $package => $users) {
$this->warn(" - {$package}: ".implode(', ', $users));
}
$this->line('');
}
$this->info('📦 모든 모듈의 Composer 의존성 설치 시작');
$successCount = 0;
$skipCount = 0;
$failCount = 0;
foreach ($modules as $identifier => $module) {
if (! $this->extensionManager->hasComposerDependencies('modules', $identifier)) {
$skipCount++;
continue;
}
$this->line(" [{$identifier}]");
$result = $this->extensionManager->runComposerInstall('modules', $identifier, $noDev, $this);
if ($result) {
$successCount++;
$this->info(" ✅ 완료: {$identifier}");
} else {
$failCount++;
$this->error(" ❌ 실패: {$identifier}");
}
$this->line('');
}
// 오토로드 갱신
$this->extensionManager->updateComposerAutoload();
$this->info(__('modules.composer_install.summary', [
'success' => $successCount,
'skip' => $skipCount,
'fail' => $failCount,
]));
return $failCount > 0 ? Command::FAILURE : Command::SUCCESS;
}
}