feat: 增强插件加载过程,记录 on_load 失败的插件并跳过注册
This commit is contained in:
@@ -59,7 +59,8 @@ class RunnerIPCLogHandler(logging.Handler):
|
|||||||
FLUSH_BATCH_SIZE: int = 20
|
FLUSH_BATCH_SIZE: int = 20
|
||||||
|
|
||||||
#: 仅转发 logger name 以这些前缀开头的日志,第三方库日志将被忽略
|
#: 仅转发 logger name 以这些前缀开头的日志,第三方库日志将被忽略
|
||||||
ALLOWED_LOGGER_PREFIXES: tuple[str, ...] = ("plugin.", "plugin_runtime.")
|
#: 包含 "_maibot_plugin_" 前缀以覆盖插件模块中 logging.getLogger(__name__) 的场景
|
||||||
|
ALLOWED_LOGGER_PREFIXES: tuple[str, ...] = ("plugin.", "plugin_runtime.", "_maibot_plugin_")
|
||||||
|
|
||||||
def __init__(self) -> None:
|
def __init__(self) -> None:
|
||||||
super().__init__()
|
super().__init__()
|
||||||
|
|||||||
@@ -84,6 +84,7 @@ class PluginRunner:
|
|||||||
logger.info(f"已加载 {len(plugins)} 个插件")
|
logger.info(f"已加载 {len(plugins)} 个插件")
|
||||||
|
|
||||||
# 4. 注入 PluginContext + 调用 on_load 生命周期钩子
|
# 4. 注入 PluginContext + 调用 on_load 生命周期钩子
|
||||||
|
failed_plugins: set[str] = set()
|
||||||
for meta in plugins:
|
for meta in plugins:
|
||||||
instance = meta.instance
|
instance = meta.instance
|
||||||
self._inject_context(meta.plugin_id, instance)
|
self._inject_context(meta.plugin_id, instance)
|
||||||
@@ -93,10 +94,13 @@ class PluginRunner:
|
|||||||
if asyncio.iscoroutine(ret):
|
if asyncio.iscoroutine(ret):
|
||||||
await ret
|
await ret
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f"插件 {meta.plugin_id} on_load 失败: {e}", exc_info=True)
|
logger.error(f"插件 {meta.plugin_id} on_load 失败,跳过注册: {e}", exc_info=True)
|
||||||
|
failed_plugins.add(meta.plugin_id)
|
||||||
|
|
||||||
# 5. 向 Host 注册所有插件的组件
|
# 5. 向 Host 注册所有插件的组件(跳过 on_load 失败的插件)
|
||||||
for meta in plugins:
|
for meta in plugins:
|
||||||
|
if meta.plugin_id in failed_plugins:
|
||||||
|
continue
|
||||||
await self._register_plugin(meta)
|
await self._register_plugin(meta)
|
||||||
|
|
||||||
# 5. 等待直到收到关停信号
|
# 5. 等待直到收到关停信号
|
||||||
|
|||||||
Reference in New Issue
Block a user