feat: 添加 Host 应用版本号支持,优化插件加载和热重载逻辑,检测重复插件 ID

This commit is contained in:
DrSmoothl
2026-03-13 17:35:35 +08:00
parent 8da1b6d93f
commit 2f3519411a
6 changed files with 189 additions and 65 deletions

View File

@@ -78,6 +78,7 @@ class PluginLoader:
"""
# 第一阶段:发现并校验 manifest
candidates: Dict[str, Tuple[str, Dict[str, Any], str]] = {} # id -> (dir, manifest, plugin_path)
duplicate_candidates: Dict[str, List[str]] = {}
for base_dir in plugin_dirs:
if not os.path.isdir(base_dir):
logger.warning(f"插件目录不存在: {base_dir}")
@@ -107,9 +108,25 @@ class PluginLoader:
self._failed_plugins[entry] = f"manifest 校验失败: {errors}"
continue
plugin_id = manifest.get("name", entry)
plugin_id = str(manifest.get("name", entry)).strip() or entry
if plugin_id in duplicate_candidates:
duplicate_candidates[plugin_id].append(plugin_dir)
continue
previous = candidates.get(plugin_id)
if previous is not None:
duplicate_candidates[plugin_id] = [previous[0], plugin_dir]
candidates.pop(plugin_id, None)
continue
candidates[plugin_id] = (plugin_dir, manifest, plugin_path)
for plugin_id, conflict_dirs in duplicate_candidates.items():
unique_dirs = sorted(dict.fromkeys(conflict_dirs))
reason = f"检测到重复插件 ID: {plugin_id} -> {', '.join(unique_dirs)}"
self._failed_plugins[plugin_id] = reason
logger.error(reason)
# 第二阶段:依赖解析(拓扑排序)
load_order, failed_deps = self._resolve_dependencies(candidates)