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;
}
}