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 1/2] 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): From 3078c076dc5d626c7b9f9bf615f076b58e77788c Mon Sep 17 00:00:00 2001 From: Aqr-K <95741669+Aqr-K@users.noreply.github.com> Date: Sat, 4 Jan 2025 14:20:03 +0800 Subject: [PATCH 2/2] =?UTF-8?q?fix(plugin):=20=E8=B0=83=E6=95=B4=E5=88=A4?= =?UTF-8?q?=E6=96=AD=E9=A1=BA=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/core/config.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/app/core/config.py b/app/core/config.py index 63bdf646..0fc9850d 100644 --- a/app/core/config.py +++ b/app/core/config.py @@ -418,19 +418,21 @@ class Settings(BaseSettings, ConfigModel, LogConfigModel): 更新多个配置项 """ results = {} - log_updated = False + log_updated, plugin_monitor_updated = False, False for k, v in env.items(): 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() + plugin_monitor_updated = True # 本次更新存在日志配置项更新,需要重新加载日志配置 if log_updated: logger.update_loggers() + # 本次更新存在插件监控配置项更新,需要重新加载插件监控 + if plugin_monitor_updated: + # 解决顶层循环导入问题 + from app.core.plugin import PluginManager + PluginManager().reload_monitor() return results @property