266 lines
8.0 KiB
PHP
266 lines
8.0 KiB
PHP
<?php
|
|
|
|
namespace App\Console\Commands;
|
|
|
|
use App\Services\EnvService;
|
|
use Illuminate\Console\Command;
|
|
|
|
class EnvCommand extends Command
|
|
{
|
|
protected $signature = 'env:manage
|
|
{action : 操作类型 (list|environments|apply|save|import|delete)}
|
|
{--project= : 项目名称}
|
|
{--environment= : 环境名称}
|
|
{--content= : 环境文件内容}';
|
|
|
|
protected $description = '环境文件管理工具';
|
|
|
|
private EnvService $envManager;
|
|
|
|
public function __construct(EnvService $envManager)
|
|
{
|
|
parent::__construct();
|
|
$this->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];
|
|
}
|
|
}
|