Merge pull request #2929 from InfinityPacer/feature/setup

This commit is contained in:
jxxghp
2024-10-24 19:25:48 +08:00
committed by GitHub
3 changed files with 11 additions and 11 deletions
+1
View File
@@ -339,6 +339,7 @@ class PluginManager(metaclass=Singleton):
missing_dependencies = self.pluginhelper.find_missing_dependencies() missing_dependencies = self.pluginhelper.find_missing_dependencies()
if not missing_dependencies: if not missing_dependencies:
return missing_dependencies return missing_dependencies
logger.debug(f"检测到缺失的依赖项: {missing_dependencies}")
logger.info(f"开始安装缺失的依赖项,共 {len(missing_dependencies)} 个...") logger.info(f"开始安装缺失的依赖项,共 {len(missing_dependencies)} 个...")
# 第二步:安装依赖项并返回结果 # 第二步:安装依赖项并返回结果
total_start_time = time.time() total_start_time = time.time()
+6 -10
View File
@@ -4,11 +4,10 @@ import traceback
from pathlib import Path from pathlib import Path
from typing import Any, Dict, List, Optional, Tuple, Set from typing import Any, Dict, List, Optional, Tuple, Set
import pkg_resources
from cachetools import TTLCache, cached from cachetools import TTLCache, cached
from packaging.specifiers import SpecifierSet, InvalidSpecifier from packaging.specifiers import SpecifierSet, InvalidSpecifier
from packaging.version import Version, InvalidVersion from packaging.version import Version, InvalidVersion
from pkg_resources import Requirement from pkg_resources import Requirement, working_set
from app.core.config import settings from app.core.config import settings
from app.db.systemconfig_oper import SystemConfigOper from app.db.systemconfig_oper import SystemConfigOper
@@ -404,7 +403,7 @@ class PluginHelper(metaclass=Singleton):
:return: 备份目录路径 :return: 备份目录路径
""" """
plugin_dir = PLUGIN_DIR / pid plugin_dir = PLUGIN_DIR / pid
backup_dir = Path(settings.TEMP_PATH) / "plugins_backup" / pid backup_dir = Path(settings.TEMP_PATH) / "plugin_backup" / pid
if plugin_dir.exists(): if plugin_dir.exists():
# 备份时清理已有的备份目录,防止残留文件影响 # 备份时清理已有的备份目录,防止残留文件影响
@@ -577,12 +576,12 @@ class PluginHelper(metaclass=Singleton):
""" """
try: try:
# 收集所有插件的依赖项 # 收集所有插件的依赖项
missing_dependencies = self.__find_plugin_dependencies() # 返回格式为 {package_name: version_specifier} plugin_dependencies = self.__find_plugin_dependencies() # 返回格式为 {package_name: version_specifier}
# 获取已安装的包及其版本 # 获取已安装的包及其版本
installed_packages = self.__get_installed_packages() # 返回格式为 {package_name: Version} installed_packages = self.__get_installed_packages() # 返回格式为 {package_name: Version}
# 需要安装或更新的依赖项列表 # 需要安装或更新的依赖项列表
dependencies_to_install = [] dependencies_to_install = []
for pkg_name, version_specifier in missing_dependencies.items(): for pkg_name, version_specifier in plugin_dependencies.items():
spec_set = SpecifierSet(version_specifier) spec_set = SpecifierSet(version_specifier)
installed_version = installed_packages.get(pkg_name) installed_version = installed_packages.get(pkg_name)
if installed_version is None: if installed_version is None:
@@ -620,7 +619,7 @@ class PluginHelper(metaclass=Singleton):
requirements_temp_file.parent.mkdir(parents=True, exist_ok=True) requirements_temp_file.parent.mkdir(parents=True, exist_ok=True)
with open(requirements_temp_file, "w", encoding="utf-8") as f: with open(requirements_temp_file, "w", encoding="utf-8") as f:
for dep in dependencies: for dep in dependencies:
f.write(dep + '\n') f.write(dep + "\n")
# 使用自动降级策略安装依赖 # 使用自动降级策略安装依赖
success, message = self.__pip_install_with_fallback(requirements_temp_file) success, message = self.__pip_install_with_fallback(requirements_temp_file)
@@ -640,7 +639,7 @@ class PluginHelper(metaclass=Singleton):
""" """
installed_packages = {} installed_packages = {}
try: try:
for dist in pkg_resources.working_set: for dist in working_set:
pkg_name = self.__standardize_pkg_name(dist.project_name) pkg_name = self.__standardize_pkg_name(dist.project_name)
try: try:
installed_packages[pkg_name] = Version(dist.version) installed_packages[pkg_name] = Version(dist.version)
@@ -668,7 +667,6 @@ class PluginHelper(metaclass=Singleton):
# 解析当前插件的 requirements.txt,获取依赖项 # 解析当前插件的 requirements.txt,获取依赖项
plugin_deps = self.__parse_requirements(requirements_file) plugin_deps = self.__parse_requirements(requirements_file)
for pkg_name, version_specifiers in plugin_deps.items(): for pkg_name, version_specifiers in plugin_deps.items():
logger.debug(f"当前处理的包:{pkg_name}, 版本约束:{version_specifiers}")
if pkg_name in dependencies: if pkg_name in dependencies:
# 更新已存在的包的版本约束集合 # 更新已存在的包的版本约束集合
dependencies[pkg_name].update(version_specifiers) dependencies[pkg_name].update(version_specifiers)
@@ -699,7 +697,6 @@ class PluginHelper(metaclass=Singleton):
req = Requirement(line) req = Requirement(line)
pkg_name = self.__standardize_pkg_name(req.name) pkg_name = self.__standardize_pkg_name(req.name)
version_specifier = str(req.specifier) version_specifier = str(req.specifier)
logger.debug(f"解析到依赖项:包名={pkg_name}, 版本约束={version_specifier}")
if pkg_name in dependencies: if pkg_name in dependencies:
dependencies[pkg_name].append(version_specifier) dependencies[pkg_name].append(version_specifier)
else: else:
@@ -723,7 +720,6 @@ class PluginHelper(metaclass=Singleton):
try: try:
merged_dependencies = {} merged_dependencies = {}
for pkg_name, version_specifiers in dependencies.items(): for pkg_name, version_specifiers in dependencies.items():
logger.debug(f"合并包:{pkg_name} 的版本约束:{version_specifiers}")
# 合并版本约束 # 合并版本约束
spec_set = SpecifierSet() spec_set = SpecifierSet()
for specifier in version_specifiers: for specifier in version_specifiers:
+4 -1
View File
@@ -41,10 +41,13 @@ async def init_plugins_async():
async def execute_task(loop, task_func, task_name): async def execute_task(loop, task_func, task_name):
"""
执行后台任务
"""
try: try:
result = await loop.run_in_executor(None, task_func) result = await loop.run_in_executor(None, task_func)
if isinstance(result, list) and result: if isinstance(result, list) and result:
logger.info(f"{task_name} 已完成,共处理 {len(result)} 个项目") logger.debug(f"{task_name} 已完成,共处理 {len(result)} 个项目")
else: else:
logger.debug(f"没有新的 {task_name} 需要处理") logger.debug(f"没有新的 {task_name} 需要处理")
return result return result