🐛 fix require new plugin context error (#2040)

This commit is contained in:
Ju4tCode 2023-05-22 00:00:50 +08:00 committed by GitHub
parent 99197f30f6
commit 2cfc20c143
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 11 additions and 2 deletions

View File

@ -13,7 +13,7 @@ from nonebot.utils import path_to_module_name
from .plugin import Plugin from .plugin import Plugin
from .manager import PluginManager from .manager import PluginManager
from . import _managers, get_plugin, _module_name_to_plugin_name from . import _managers, get_plugin, _current_plugin_chain, _module_name_to_plugin_name
try: # pragma: py-gte-311 try: # pragma: py-gte-311
import tomllib # pyright: ignore[reportMissingImports] import tomllib # pyright: ignore[reportMissingImports]
@ -161,11 +161,19 @@ def require(name: str) -> ModuleType:
RuntimeError: 插件无法加载 RuntimeError: 插件无法加载
""" """
plugin = get_plugin(_module_name_to_plugin_name(name)) plugin = get_plugin(_module_name_to_plugin_name(name))
# if plugin not loaded
if not plugin: if not plugin:
# plugin already declared
if manager := _find_manager_by_name(name): if manager := _find_manager_by_name(name):
plugin = manager.load_plugin(name) plugin = manager.load_plugin(name)
# plugin not declared, try to declare and load it
else: else:
plugin = load_plugin(name) # clear current plugin chain, ensure plugin loaded in a new context
_t = _current_plugin_chain.set(())
try:
plugin = load_plugin(name)
finally:
_current_plugin_chain.reset(_t)
if not plugin: if not plugin:
raise RuntimeError(f'Cannot load plugin "{name}"!') raise RuntimeError(f'Cannot load plugin "{name}"!')
return plugin.module return plugin.module

View File

@ -228,6 +228,7 @@ class PluginLoader(SourceFileLoader):
# detect parent plugin before entering current plugin context # detect parent plugin before entering current plugin context
parent_plugins = _current_plugin_chain.get() parent_plugins = _current_plugin_chain.get()
for pre_plugin in reversed(parent_plugins): for pre_plugin in reversed(parent_plugins):
# ensure parent plugin is declared before current plugin
if _managers.index(pre_plugin.manager) < _managers.index(self.manager): if _managers.index(pre_plugin.manager) < _managers.index(self.manager):
plugin.parent_plugin = pre_plugin plugin.parent_plugin = pre_plugin
pre_plugin.sub_plugins.add(plugin) pre_plugin.sub_plugins.add(plugin)