一个为 NoneBot2 插件设计的统一文件配置管理器,提供了便捷的配置文件管理、热重载和文件监控功能。
- 类型安全的配置管理:基于 Pydantic BaseModel,提供类型检查和自动验证
- 配置热重载:当配置文件被修改时,自动重新加载配置
- 单例模式:确保每个插件的配置管理器只有一个实例
- 异步支持:完全异步实现,不阻塞事件循环
- 灵活的配置定义:支持多种配置类定义方式
- 文件和目录监控:支持对配置文件和自定义文件/目录的监控
# 使用 nb-cli 安装
nb plugin install nonebot-plugin-uniconf
# 使用 pip 安装
pip install nonebot-plugin-uniconf首先,定义一个继承自 Pydantic 的 BaseModel 的配置类:
from pydantic import BaseModel
class MyConfig(BaseModel):
my_option: str = "default_value"
my_number: int = 42有两种方式创建配置管理器:
from nonebot_plugin_uniconf import BaseDataManager
from nonebot import logger
class MyDataManager(BaseDataManager[MyConfig]):
config: MyConfig # 配置实例,类型注解用于自动推导 config_class
async def __apost_init__(self):
# 配置加载完成后的异步初始化
logger.info(f"配置已加载: {self.config.my_option}")from nonebot_plugin_uniconf import BaseDataManager
from nonebot import logger
class MyDataManager(BaseDataManager[MyConfig]):
config_class = MyConfig # 配置类类型
async def __apost_init__(self):
# 配置加载完成后的异步初始化
logger.info(f"配置已加载: {self.config.my_number}")# 获取配置管理器实例
config_manager = MyDataManager()
# 获取配置(会等待配置加载完成)
config = await config_manager.safe_get_config()
logger.debug(config.my_option)如果需要更细粒度的控制,可以直接使用 UniConfigManager:
from nonebot_plugin_uniconf import UniConfigManager
# 添加配置类
await UniConfigManager().add_config(MyConfig)
# 获取配置
config = await UniConfigManager().get_config() # 请自行缓存配置文件实例或者缓存try_get_caller_plugin()的name字段并传入,因为频繁获取堆栈上下文会导致性能问题
# 保存配置
await UniConfigManager().save_config()# 添加并监控额外的文件
await UniConfigManager().add_file("custom_data.txt", "初始内容")
# 添加并监控目录
async def on_directory_change(owner_name: str, path: Path):
logger.info(f"目录 {path} 已更改")
await UniConfigManager().add_directory("data", on_directory_change)配置数据管理器基类,实现了基于类型注解的自动配置类推导。
config: T- 配置实例config_class: Type[T]- 配置类类型safe_get_config()- 安全获取配置,等待配置加载完成__apost_init__()- 异步初始化后置处理方法(classmethod) __init_classvars__()- 类变量初始化方法
统一配置管理器,提供完整的配置管理功能。
add_config()- 添加配置类get_config()- 获取配置实例get_config_by_class()- 根据配置类获取配置实例reload_config()- 重新加载配置save_config()- 保存配置add_file()- 添加文件监控add_directory()- 添加目录监控get_plugin_files()- 获取插件注册的文件get_cached_file_by_path()- 获取缓存的文件内容
这个插件适合以下场景的 NoneBot2 插件,例如:
- 需要热重载配置的机器人插件
- 需要管理多个配置文件的插件
- 需要在运行时动态修改配置的插件
- AGPL-V3.0