envManager = $envManager; } public function handle(): int { $action = $this->argument('action'); try { switch ($action) { case 'list': return $this->listProjects(); case 'environments': return $this->listEnvironments(); case 'apply': return $this->applyEnvironment(); case 'save': return $this->saveEnvironment(); case 'import': return $this->importEnvironment(); case 'delete': return $this->deleteEnvironment(); default: $this->error("未知操作: {$action}"); $this->showUsage(); return 1; } } catch (\Exception $e) { $this->error("错误: " . $e->getMessage()); return 1; } } /** * 列出所有项目 */ private function listProjects(): int { $projects = $this->envManager->getProjects(); if (empty($projects)) { $this->info('没有找到任何项目'); return 0; } $this->info('项目列表:'); $this->table( ['项目名称', '路径', '有.env文件', '环境数量'], array_map(function ($project) { return [ $project['name'], $project['path'], $project['has_env'] ? '是' : '否', count($project['envs']) ]; }, $projects) ); return 0; } /** * 列出项目的环境配置 */ private function listEnvironments(): int { $project = $this->option('project'); if (!$project) { $this->error('请指定项目名称: --project=项目名'); return 1; } $environments = $this->envManager->getProjectEnvs($project); if (empty($environments)) { $this->info("项目 {$project} 没有环境配置文件"); return 0; } $this->info("项目 {$project} 的环境配置:"); $this->table( ['环境名称', '文件大小', '修改时间'], array_map(function ($env) { return [ $env['name'], $this->formatBytes($env['size']), $env['modified_at'] ]; }, $environments) ); return 0; } /** * 应用环境配置 */ private function applyEnvironment(): int { $project = $this->option('project'); $environment = $this->option('environment'); if (!$project || !$environment) { $this->error('请指定项目名称和环境名称: --project=项目名 --environment=环境名'); return 1; } if ($this->confirm("确定要将 {$environment} 环境应用到项目 {$project} 吗?")) { $success = $this->envManager->applyEnv($project, $environment); if ($success) { $this->info("成功将 {$environment} 环境应用到项目 {$project}"); return 0; } else { $this->error("应用环境配置失败"); return 1; } } $this->info('操作已取消'); return 0; } /** * 保存环境配置 */ private function saveEnvironment(): int { $project = $this->option('project'); $environment = $this->option('environment'); $content = $this->option('content'); if (!$project || !$environment) { $this->error('请指定项目名称和环境名称: --project=项目名 --environment=环境名'); return 1; } if (!$content) { $this->info('请输入环境配置内容 (输入完成后按 Ctrl+D):'); $content = ''; while (($line = fgets(STDIN)) !== false) { $content .= $line; } } if (empty(trim($content))) { $this->error('环境配置内容不能为空'); return 1; } $success = $this->envManager->saveEnv($project, $environment, $content); if ($success) { $this->info("成功保存环境配置 {$project}/{$environment}"); return 0; } else { $this->error("保存环境配置失败"); return 1; } } /** * 从项目导入环境配置 */ private function importEnvironment(): int { $project = $this->option('project'); $environment = $this->option('environment'); if (!$project || !$environment) { $this->error('请指定项目名称和环境名称: --project=项目名 --environment=环境名'); return 1; } $success = $this->envManager->importFromProject($project, $environment); if ($success) { $this->info("成功从项目 {$project} 导入环境配置为 {$environment}"); return 0; } else { $this->error("导入环境配置失败"); return 1; } } /** * 删除环境配置 */ private function deleteEnvironment(): int { $project = $this->option('project'); $environment = $this->option('environment'); if (!$project || !$environment) { $this->error('请指定项目名称和环境名称: --project=项目名 --environment=环境名'); return 1; } if ($this->confirm("确定要删除环境配置 {$project}/{$environment} 吗?")) { $success = $this->envManager->deleteEnv($project, $environment); if ($success) { $this->info("成功删除环境配置 {$project}/{$environment}"); return 0; } else { $this->error("删除环境配置失败"); return 1; } } $this->info('操作已取消'); return 0; } /** * 显示使用说明 */ private function showUsage(): void { $this->info('使用说明:'); $this->line(' php artisan env:manage list # 列出所有项目'); $this->line(' php artisan env:manage environments --project=项目名 # 列出项目环境'); $this->line(' php artisan env:manage apply --project=项目名 --environment=环境名 # 应用环境'); $this->line(' php artisan env:manage save --project=项目名 --environment=环境名 # 保存环境'); $this->line(' php artisan env:manage import --project=项目名 --environment=环境名 # 导入环境'); $this->line(' php artisan env:manage delete --project=项目名 --environment=环境名 # 删除环境'); } /** * 格式化字节大小 */ private function formatBytes(int $bytes): string { $units = ['B', 'KB', 'MB', 'GB']; $bytes = max($bytes, 0); $pow = floor(($bytes ? log($bytes) : 0) / log(1024)); $pow = min($pow, count($units) - 1); $bytes /= pow(1024, $pow); return round($bytes, 2) . ' ' . $units[$pow]; } }