fix(plugin-store-downlaod): 修复插件商店下载二进制文件错误 (#2152)

* fix(plugin-store-downlaod): 修复插件商店下载二进制文件错误

* fix(plugin_store): 修复插件商店中仓库类型判断逻辑错误

当处理外部插件时,修正了仓库类型的判断条件,确保正确的仓库类型被设置。
同时修复了目录文件列表获取时传递错误的仓库类型参数问题。

* feat(repo_utils): 更新文件管理器返回类型并改进仓库URL处理

- 将 RepoFileManager 的文件内容返回类型从 bytes 改为 str,
  统一字符串类型的返回值格式

- 支持在 repo_url 中直接包含 /tree/<branch> 路径,
  自动解析分支信息并正确处理仓库地址

- 改进 GitHub 和阿里云仓库的优先级顺序,
  现在优先尝试阿里云然后是 GitHub

- 修复 clone_url 处理逻辑,确保正确的 .git 后缀添加

- 移除未使用的 Sequence 类型导入,统一使用 list[str] 类型注解

* refactor(plugin_store): 移除StoreManager中不必要的repo_type参数

移除了data_source.py文件中StoreManager类的list_directory_files方法调用时
多余的repo_type=RepoType.GITHUB参数

* feat(plugin_store): 优化插件依赖文件下载和安装逻辑

- 移动依赖文件下载逻辑到下载阶段,避免重复下载
- 使用随机数生成唯一的临时依赖文件名以避免冲突
- 添加ignore_error参数来处理依赖文件下载失败的情况
- 统一依赖文件路径变量命名,提高代码可读性
- 确保requirement.txt和requirements.txt都能正确安装

* Add repo_type parameter to list_directory_files call
This commit is contained in:
molanp
2026-07-30 16:31:23 +08:00
committed by GitHub
parent cd5fa065d3
commit 023e865f34
6 changed files with 152 additions and 291 deletions
@@ -76,10 +76,10 @@ class StoreManager:
if cached_data := await _PLUGIN_STORE_DATA_CACHE.get(cache_key):
return cached_data
plugins = await RepoFileManager.get_file_content(
plugins = await RepoFileManager.get_text_content(
DEFAULT_GITHUB_URL, "plugins.json"
)
extra_plugins = await RepoFileManager.get_file_content(
extra_plugins = await RepoFileManager.get_text_content(
EXTRA_GITHUB_URL, "plugins.json", "index"
)
result = (
@@ -337,9 +337,9 @@ class StoreManager:
source: 源
"""
repo_type = RepoType.GITHUB if is_external else None
if (
source != "ali" and source != "git" and plugin_info.ali_url
) or source == "ali":
if not is_external:
repo_type = RepoType.ALIYUN
elif (source is None and plugin_info.ali_url) or source == "ali":
repo_type = RepoType.ALIYUN
elif source == "git":
repo_type = RepoType.GITHUB
@@ -370,11 +370,17 @@ class StoreManager:
dst_path = target_dir / f"{plugin_module}.py"
download_files.append((src_path, dst_path))
rand = random.randint(1, 10000)
requirement_path_ = TEMP_PATH / f"plugin_store_{rand}_req.txt"
requirements_path_ = TEMP_PATH / f"plugin_store_{rand}_reqs.txt"
download_files.append(("requirement.txt", requirement_path_))
download_files.append(("requirements.txt", requirements_path_))
result = await RepoFileManager.download_files(
github_url,
download_files,
branch,
repo_type=repo_type,
ignore_error=True,
)
if not result.success:
raise PluginStoreException(result.error_message)
@@ -396,32 +402,18 @@ class StoreManager:
await VirtualEnvPackageManager.install_requirement(requirement_file)
if not is_install_req:
# 从仓库根目录查找文件
rand = random.randint(1, 10000)
requirement_path = TEMP_PATH / f"plugin_store_{rand}_req.txt"
requirements_path = TEMP_PATH / f"plugin_store_{rand}_reqs.txt"
await RepoFileManager.download_files(
github_url,
[
("requirement.txt", requirement_path),
("requirements.txt", requirements_path),
],
branch,
repo_type=repo_type,
ignore_error=True,
)
if requirement_path.exists():
if requirement_path_.exists():
logger.info(
f"开始安装插件 {module_path} 依赖文件: {requirement_path}",
f"开始安装插件 {module_path} 依赖文件: {requirement_path_}",
LOG_COMMAND,
)
await VirtualEnvPackageManager.install_requirement(requirement_path)
if requirements_path.exists():
await VirtualEnvPackageManager.install_requirement(requirement_path_)
if requirements_path_.exists():
logger.info(
f"开始安装插件 {module_path} 依赖文件: {requirements_path}",
f"开始安装插件 {module_path} 依赖文件: {requirements_path_}",
LOG_COMMAND,
)
await VirtualEnvPackageManager.install_requirement(requirements_path)
await VirtualEnvPackageManager.install_requirement(requirements_path_)
@classmethod
async def remove_plugin(cls, index_or_module: str) -> str: