From d012c1e33dbed32522da26ad7a04e7809dc5a937 Mon Sep 17 00:00:00 2001 From: Junyan Qin Date: Sun, 13 Apr 2025 22:51:21 +0800 Subject: [PATCH] perf: ensure plugin deps on startup (#858) --- main.py | 3 +++ pkg/core/bootutils/deps.py | 12 ++++++++++++ pkg/persistence/mgr.py | 2 ++ pkg/plugin/loaders/classic.py | 3 +++ pkg/plugin/manager.py | 1 + pkg/utils/pkgmgr.py | 11 +++-------- 6 files changed, 24 insertions(+), 8 deletions(-) diff --git a/main.py b/main.py index c297c2a4..5c86b7ca 100644 --- a/main.py +++ b/main.py @@ -35,6 +35,9 @@ async def main_entry(loop: asyncio.AbstractEventLoop): await deps.install_deps(missing_deps) print("已自动安装缺失的依赖包,请重启程序。") sys.exit(0) + + # check plugin deps + await deps.precheck_plugin_deps() # 检查pydantic版本,如果没有 pydantic.v1,则把 pydantic 映射为 v1 import pydantic.version diff --git a/pkg/core/bootutils/deps.py b/pkg/core/bootutils/deps.py index 47b87d35..84c9e4d1 100644 --- a/pkg/core/bootutils/deps.py +++ b/pkg/core/bootutils/deps.py @@ -1,4 +1,6 @@ import pip +import os +from ...utils import pkgmgr # 检查依赖,防止用户未安装 # 左边为引入名称,右边为依赖名称 @@ -55,3 +57,13 @@ async def install_deps(deps: list[str]): for dep in deps: pip.main(["install", required_deps[dep]]) + +async def precheck_plugin_deps(): + print('Prechecking plugin dependencies...') + + for dir in os.listdir("plugins"): + subdir = os.path.join("plugins", dir) + if not os.path.isdir(subdir): + continue + if 'requirements.txt' in os.listdir(subdir): + pkgmgr.install_requirements(os.path.join(subdir, 'requirements.txt'), extra_params=['-q', '-q', '-q']) \ No newline at end of file diff --git a/pkg/persistence/mgr.py b/pkg/persistence/mgr.py index dec273db..dcf19f5a 100644 --- a/pkg/persistence/mgr.py +++ b/pkg/persistence/mgr.py @@ -30,6 +30,8 @@ class PersistenceManager: self.meta = base.Base.metadata async def initialize(self): + + self.ap.logger.info("Initializing database...") for manager in database.preregistered_managers: self.db = manager(self.ap) diff --git a/pkg/plugin/loaders/classic.py b/pkg/plugin/loaders/classic.py index 3cbcdbf2..ae503ba3 100644 --- a/pkg/plugin/loaders/classic.py +++ b/pkg/plugin/loaders/classic.py @@ -3,6 +3,7 @@ from __future__ import annotations import typing import pkgutil import importlib +import os import traceback from .. import loader, events, context, models @@ -10,6 +11,8 @@ from ...core import entities as core_entities from ...provider.tools import entities as tools_entities from ...utils import funcschema from ...discover import engine as discover_engine +from ...utils import pkgmgr + class PluginLoader(loader.PluginLoader): """加载 plugins/ 目录下的插件""" diff --git a/pkg/plugin/manager.py b/pkg/plugin/manager.py index 042fb909..2ecd01c2 100644 --- a/pkg/plugin/manager.py +++ b/pkg/plugin/manager.py @@ -4,6 +4,7 @@ import typing import traceback import sqlalchemy +import logging from ..core import app, taskmgr from . import context, loader, events, installer, models diff --git a/pkg/utils/pkgmgr.py b/pkg/utils/pkgmgr.py index 9c0f8b72..4f3186b6 100644 --- a/pkg/utils/pkgmgr.py +++ b/pkg/utils/pkgmgr.py @@ -1,24 +1,19 @@ from pip._internal import main as pipmain -# from . import log - def install(package): pipmain(['install', package]) - # log.reset_logging() + def install_upgrade(package): pipmain(['install', '--upgrade', package, "-i", "https://pypi.tuna.tsinghua.edu.cn/simple", "--trusted-host", "pypi.tuna.tsinghua.edu.cn"]) - # log.reset_logging() def run_pip(params: list): pipmain(params) - # log.reset_logging() -def install_requirements(file): +def install_requirements(file, extra_params: list = []): pipmain(['install', '-r', file, "-i", "https://pypi.tuna.tsinghua.edu.cn/simple", - "--trusted-host", "pypi.tuna.tsinghua.edu.cn"]) - # log.reset_logging() + "--trusted-host", "pypi.tuna.tsinghua.edu.cn"] + extra_params)