setName('plugin:required-check') ->addOption('manifest-only', null, Option::VALUE_NONE, '仅校验清单与 Installer,不访问数据库') ->setDescription('检查所有 required=true 插件是否可安装,并验证安装启用状态'); } protected function execute(Input $input, Output $output): int { /** @var ModuleInstaller $manager */ $manager = app()->make(ModuleInstaller::class); try { $required = $manager->getRequiredPlugins(); } catch (\Throwable $e) { $output->writeln('必需插件清单检查失败:' . $e->getMessage() . ''); return 1; } if ($required === []) { $output->writeln('未声明任何 required=true 的基础插件'); return 1; } $output->writeln('必需插件清单:'); foreach ($required as $key => $meta) { $output->writeln(sprintf(' ✓ %s (%s)', $key, $meta['path'] ?? 'unknown')); } if ((bool) $input->getOption('manifest-only')) { $output->writeln('清单与 Installer 检查通过'); return 0; } $statuses = []; foreach ($manager->getStatusList() as $item) { $statuses[$item['id']] = $item; } $errors = []; foreach ($required as $key => $meta) { $status = $statuses[$key] ?? null; if (!$status || !$status['installed']) { $errors[] = "{$key} 未安装"; continue; } if (!$status['enabled']) { $errors[] = "{$key} 未启用"; } } if ($errors !== []) { foreach ($errors as $error) { $output->writeln(' ✗ ' . $error . ''); } return 1; } $output->writeln('全部必需插件均已安装并启用'); return 0; } }