diff --git a/app/api/endpoints/plugin.py b/app/api/endpoints/plugin.py index 5af5195c..d47a4591 100644 --- a/app/api/endpoints/plugin.py +++ b/app/api/endpoints/plugin.py @@ -108,13 +108,19 @@ def install(plugin_id: str, """ # 已安装插件 install_plugins = SystemConfigOper().get(SystemConfigKey.UserInstalledPlugins) or [] - # 如果是非本地括件,或者强制安装时,则需要下载安装 - if repo_url and (force or plugin_id not in PluginManager().get_plugin_ids()): - # 下载安装 - state, msg = PluginHelper().install(pid=plugin_id, repo_url=repo_url) - if not state: - # 安装失败 - return schemas.Response(success=False, message=msg) + # 首先检查插件是否已经存在,并且是否强制安装,否则只进行安装统计 + if not force and plugin_id in PluginManager().get_plugin_ids(): + PluginHelper().install_reg(pid=plugin_id) + else: + # 插件不存在或需要强制安装,下载安装并注册插件 + if repo_url: + state, msg = PluginHelper().install(pid=plugin_id, repo_url=repo_url) + # 安装失败则直接响应 + if not state: + return schemas.Response(success=False, message=msg) + else: + # repo_url 为空时,也直接响应 + return schemas.Response(success=False, message="没有传入仓库地址,无法正确安装插件,请检查配置") # 安装插件 if plugin_id not in install_plugins: install_plugins.append(plugin_id) diff --git a/app/core/plugin.py b/app/core/plugin.py index abcf5ec0..ac352e3e 100644 --- a/app/core/plugin.py +++ b/app/core/plugin.py @@ -1,5 +1,6 @@ import concurrent import concurrent.futures +import importlib.util import inspect import threading import time @@ -220,8 +221,6 @@ class PluginManager(metaclass=Singleton): # 清空指定插件 if pid in self._running_plugins: self._running_plugins.pop(pid) - if pid in self._plugins: - self._plugins.pop(pid) else: # 清空 self._plugins = {} @@ -748,10 +747,18 @@ class PluginManager(metaclass=Singleton): @staticmethod def is_plugin_exists(pid: str) -> bool: """ - 判断插件是否在本地文件系统存在 + 判断插件是否在本地包中存在 :param pid: 插件ID """ if not pid: return False - plugin_dir = settings.ROOT_PATH / "app" / "plugins" / pid.lower() - return plugin_dir.exists() + try: + # 构建包名 + package_name = f"app.plugins.{pid.lower()}" + # 检查包是否存在 + package_exists = importlib.util.find_spec(package_name) is not None + logger.debug(f"{pid} exists: {package_exists}") + return package_exists + except Exception as e: + logger.debug(f"获取插件是否在本地包中存在失败,{e}") + return False