Key features implemented: - Added new auto-dependency plugin that scans plugin manifests for system dependencies and automatically installs missing ones - Created SystemDependencyChecker class with support for multiple package managers (apt, yum, dnf, pacman, brew, apk) - Implemented PL injection interface with functions for scan, check, install, and info operations - Added context management system in core module for plugin execution environment - Created example plugin manifest demonstrating system dependency declaration - Updated .gitignore with comprehensive file exclusion patterns The plugin provides automatic scanning and installation of system dependencies declared in plugin manifests, integrating seamlessly with the plugin loader through PL injection capabilities.
78 lines
2.8 KiB
Python
78 lines
2.8 KiB
Python
"""PL 注入 - 向插件加载器注册依赖自动安装功能
|
|
|
|
此文件通过 PL 注入机制向插件加载器注册以下功能:
|
|
- auto-dependency:scan: 扫描所有插件的系统依赖声明
|
|
- auto-dependency:check: 检查系统依赖是否已安装
|
|
- auto-dependency:install: 自动安装缺失的系统依赖
|
|
- auto-dependency:info: 获取插件系统信息
|
|
"""
|
|
|
|
|
|
def register(injector):
|
|
"""向插件加载器注册功能
|
|
|
|
Args:
|
|
injector: PLInjector 实例,提供 register_function 等方法
|
|
"""
|
|
# 注意:实际的功能实现由 main.py 中的 AutoDependencyPlugin 提供
|
|
# 这里我们通过导入插件实例来注册功能
|
|
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
# 获取当前插件目录
|
|
current_file = Path(__file__)
|
|
plugin_dir = current_file.parent.parent
|
|
|
|
# 导入插件主模块
|
|
main_file = plugin_dir / "main.py"
|
|
|
|
# 创建安全的执行环境来加载插件
|
|
safe_globals = {
|
|
"__builtins__": {
|
|
"True": True, "False": False, "None": None,
|
|
"dict": dict, "list": list, "str": str, "int": int,
|
|
"float": float, "bool": bool, "tuple": tuple, "set": set,
|
|
"len": len, "range": range, "enumerate": enumerate,
|
|
"zip": zip, "map": map, "filter": filter,
|
|
"sorted": sorted, "reversed": reversed,
|
|
"min": min, "max": max, "sum": sum, "abs": abs,
|
|
"round": round, "isinstance": isinstance, "issubclass": issubclass,
|
|
"type": type, "id": id, "hash": hash, "repr": repr,
|
|
"print": print, "object": object, "property": property,
|
|
"staticmethod": staticmethod, "classmethod": classmethod,
|
|
"super": super, "iter": iter, "next": next,
|
|
"any": any, "all": all, "callable": callable,
|
|
"hasattr": hasattr, "getattr": getattr, "setattr": setattr,
|
|
"Exception": Exception, "BaseException": BaseException,
|
|
},
|
|
"__name__": "plugin.auto-dependency",
|
|
"__package__": "plugin.auto-dependency",
|
|
"__file__": str(main_file),
|
|
"Path": Path,
|
|
}
|
|
|
|
try:
|
|
with open(main_file, "r", encoding="utf-8") as f:
|
|
source = f.read()
|
|
|
|
code = compile(source, str(main_file), "exec")
|
|
exec(code, safe_globals)
|
|
|
|
# 获取 New 函数并创建插件实例
|
|
new_func = safe_globals.get("New")
|
|
if new_func and callable(new_func):
|
|
plugin_instance = new_func()
|
|
|
|
# 初始化插件
|
|
plugin_instance.init({
|
|
"scan_dirs": ["store"],
|
|
"auto_install": True
|
|
})
|
|
|
|
# 使用插件实例注册 PL 功能
|
|
plugin_instance.register_pl_functions(injector)
|
|
|
|
except Exception as e:
|
|
print(f"[auto-dependency] PL 注册失败:{e}")
|