From a7794fa2addeb31f1c773bd89f6772797bcffcfc Mon Sep 17 00:00:00 2001 From: Aqr-K <95741669+Aqr-K@users.noreply.github.com> Date: Sat, 4 Jan 2025 05:42:51 +0800 Subject: [PATCH] feat(plugin): feat(log): plugin `monitor` supports hot update. --- app/core/config.py | 5 +++++ app/core/plugin.py | 22 ++++++++++++++++++---- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/app/core/config.py b/app/core/config.py index 0b2b76b2..63bdf646 100644 --- a/app/core/config.py +++ b/app/core/config.py @@ -423,6 +423,11 @@ class Settings(BaseSettings, ConfigModel, LogConfigModel): results[k] = self.update_setting(k, v) if hasattr(log_settings, k): log_updated = True + + if k in ["PLUGIN_AUTO_RELOAD", "DEV"]: + # 解决顶层循环导入问题 + from app.core.plugin import PluginManager + PluginManager().reload_monitor() # 本次更新存在日志配置项更新,需要重新加载日志配置 if log_updated: logger.update_loggers() diff --git a/app/core/plugin.py b/app/core/plugin.py index 89f499c3..98176617 100644 --- a/app/core/plugin.py +++ b/app/core/plugin.py @@ -220,11 +220,23 @@ class PluginManager(metaclass=Singleton): self._running_plugins = {} logger.info("插件停止完成") + def reload_monitor(self): + """ + 重新加载插件文件修改监测 + """ + if settings.DEV or settings.PLUGIN_AUTO_RELOAD: + if self._observer and self._observer.is_alive(): + logger.info("插件文件修改监测已经在运行中...") + else: + self.__start_monitor() + else: + self.stop_monitor() + def __start_monitor(self): """ - 开发者模式下监测插件文件修改 + 启用监测插件文件修改监测 """ - logger.info("开发者模式下开始监测插件文件修改...") + logger.info("开始监测插件文件修改...") monitor_handler = PluginMonitorHandler() self._observer = Observer() self._observer.schedule(monitor_handler, str(settings.ROOT_PATH / "app" / "plugins"), recursive=True) @@ -232,14 +244,16 @@ class PluginManager(metaclass=Singleton): def stop_monitor(self): """ - 停止监测插件修改 + 停止监测插件文件修改监测 """ # 停止监测 - if self._observer: + if self._observer and self._observer.is_alive(): logger.info("正在停止插件文件修改监测...") self._observer.stop() self._observer.join() logger.info("插件文件修改监测停止完成") + else: + logger.info("未启用插件文件修改监测,无需停止") @staticmethod def __stop_plugin(plugin: Any):