fix 恢复插件后安装依赖

This commit is contained in:
jxxghp
2025-06-28 21:42:03 +08:00
parent 037c6b02fa
commit cbf1dbcd2e
2 changed files with 19 additions and 16 deletions

View File

@@ -11,6 +11,7 @@ from app.schemas import Notification, MessageChannel
from app.utils.http import RequestUtils from app.utils.http import RequestUtils
from app.utils.system import SystemUtils from app.utils.system import SystemUtils
from app.helper.system import SystemHelper from app.helper.system import SystemHelper
from app.helper.plugin import PluginHelper
from version import FRONTEND_VERSION, APP_VERSION from version import FRONTEND_VERSION, APP_VERSION
@@ -135,6 +136,13 @@ class SystemChain(ChainBase):
shutil.rmtree(target_path) shutil.rmtree(target_path)
shutil.copytree(item, target_path) shutil.copytree(item, target_path)
logger.info(f"已恢复插件目录: {item.name}") logger.info(f"已恢复插件目录: {item.name}")
# 安装依赖
requirements_file = target_path / "requirements.txt"
if requirements_file.exists():
logger.info(f"正在安装插件 {item.name} 的依赖...")
success, message = PluginHelper.pip_install_with_fallback(requirements_file)
if not success:
logger.warn(f"插件 {item.name} 依赖安装失败: {message}")
restored_count += 1 restored_count += 1
# 如果是文件 # 如果是文件
elif item.is_file(): elif item.is_file():

View File

@@ -112,14 +112,11 @@ class PluginHelper(metaclass=Singleton):
package_version = settings.VERSION_FLAG package_version = settings.VERSION_FLAG
# 优先检查指定版本的插件,即 package.v(x).json 文件中是否存在该插件,如果存在,返回该版本号 # 优先检查指定版本的插件,即 package.v(x).json 文件中是否存在该插件,如果存在,返回该版本号
plugins = self.get_plugins(repo_url, package_version) if pid in (self.get_plugins(repo_url, package_version) or []):
if pid in plugins:
return package_version return package_version
# 如果指定版本的插件不存在,检查全局 package.json 文件,查看插件是否兼容指定的版本 # 如果指定版本的插件不存在,检查全局 package.json 文件,查看插件是否兼容指定的版本
global_plugins = self.get_plugins(repo_url) plugin = (self.get_plugins(repo_url) or {}).get(pid, None)
plugin = global_plugins.get(pid, None)
# 检查插件是否明确支持当前指定的版本(如 v2 或 v3如果支持返回空字符串表示使用 package.jsonv1 # 检查插件是否明确支持当前指定的版本(如 v2 或 v3如果支持返回空字符串表示使用 package.jsonv1
if plugin and plugin.get(package_version) is True: if plugin and plugin.get(package_version) is True:
return "" return ""
@@ -402,8 +399,7 @@ class PluginHelper(metaclass=Singleton):
with open(requirements_file_path, "w", encoding="utf-8") as f: with open(requirements_file_path, "w", encoding="utf-8") as f:
f.write(requirements_txt) f.write(requirements_txt)
success, message = self.__pip_install_with_fallback(requirements_file_path) return self.pip_install_with_fallback(requirements_file_path)
return success, message
return True, "" # 如果 requirements.txt 为空,视作成功 return True, "" # 如果 requirements.txt 为空,视作成功
@@ -420,7 +416,7 @@ class PluginHelper(metaclass=Singleton):
# 检查是否存在 requirements.txt 文件 # 检查是否存在 requirements.txt 文件
if requirements_file.exists(): if requirements_file.exists():
logger.info(f"{pid} 存在依赖,开始尝试安装依赖") logger.info(f"{pid} 存在依赖,开始尝试安装依赖")
success, error_message = self.__pip_install_with_fallback(requirements_file) success, error_message = self.pip_install_with_fallback(requirements_file)
if success: if success:
return True, True, "" return True, True, ""
else: else:
@@ -478,7 +474,7 @@ class PluginHelper(metaclass=Singleton):
shutil.rmtree(plugin_dir, ignore_errors=True) shutil.rmtree(plugin_dir, ignore_errors=True)
@staticmethod @staticmethod
def __pip_install_with_fallback(requirements_file: Path) -> Tuple[bool, str]: def pip_install_with_fallback(requirements_file: Path) -> Tuple[bool, str]:
""" """
使用自动降级策略安装依赖,并确保新安装的包可被动态导入 使用自动降级策略安装依赖,并确保新安装的包可被动态导入
:param requirements_file: 依赖的 requirements.txt 文件路径 :param requirements_file: 依赖的 requirements.txt 文件路径
@@ -599,7 +595,6 @@ class PluginHelper(metaclass=Singleton):
def install_dependencies(self, dependencies: List[str]) -> Tuple[bool, str]: def install_dependencies(self, dependencies: List[str]) -> Tuple[bool, str]:
""" """
安装指定的依赖项列表 安装指定的依赖项列表
:param dependencies: 需要安装或更新的依赖项列表 :param dependencies: 需要安装或更新的依赖项列表
:return: (success, message) :return: (success, message)
""" """
@@ -614,12 +609,12 @@ class PluginHelper(metaclass=Singleton):
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")
try:
# 使用自动降级策略安装依赖 # 使用自动降级策略安装依赖
success, message = self.__pip_install_with_fallback(requirements_temp_file) return self.pip_install_with_fallback(requirements_temp_file)
# 删除临时文件 finally:
requirements_temp_file.unlink() # 删除临时文件
return success, message requirements_temp_file.unlink()
except Exception as e: except Exception as e:
logger.error(f"安装依赖项时发生错误:{e}") logger.error(f"安装依赖项时发生错误:{e}")
return False, f"安装依赖项时发生错误:{e}" return False, f"安装依赖项时发生错误:{e}"