无hooks.py文件的扩展包作为模块包安装到jingrow里面

This commit is contained in:
jingrow 2025-10-26 23:50:04 +08:00
parent ad5129497e
commit 0dccec34d9
2 changed files with 80 additions and 1 deletions

View File

@ -115,7 +115,11 @@ async def install_app_from_upload(
backend_result = result.get('backend_result', {})
app_dir = backend_result.get('app_dir')
# 对齐扫描安装的执行链
# 判断是否为扩展包安装(没有 app_dir 说明是扩展包)
if not app_dir:
return result
# 对齐扫描安装的执行链 - 只针对独立应用安装
try:
# 1. 添加到 Local Installed Apps PageType
from jingrow.utils.jingrow_api import get_single_pagetype

View File

@ -216,6 +216,72 @@ def cleanup_temp_dir(temp_dir: str):
pass
@handle_errors
def install_package(temp_dir: str, package_info: Dict[str, Any]) -> Dict[str, Any]:
"""将扩展包直接复制到 jingrow 应用内部并同步到数据库"""
root_dir = package_info.get('root_dir', temp_dir)
# 获取 jingrow 应用目录
apps_dir, _ = get_app_directories()
jingrow_backend_dir = apps_dir / "jingrow" / "jingrow"
if not jingrow_backend_dir.exists():
return {'success': False, 'error': '找不到 jingrow 应用目录'}
# 检查是否有 app_name 子目录
app_name = package_info.get('app_name')
inner_app_dir = os.path.join(root_dir, app_name)
if os.path.exists(inner_app_dir) and os.path.isdir(inner_app_dir):
for item in os.listdir(inner_app_dir):
if item in ['__pycache__', '.git']:
continue
src = os.path.join(inner_app_dir, item)
dst = jingrow_backend_dir / item
# 跳过 .json 文件和文档文件
if item.endswith('.json') or item in ['LICENSE.md', 'README.md', 'README']:
continue
if os.path.isdir(src):
if dst.exists():
shutil.rmtree(dst)
shutil.copytree(src, dst)
else:
shutil.copy2(src, dst)
else:
for item in os.listdir(root_dir):
if item in ['__pycache__', '.git', 'frontend']:
continue
# 跳过 .json 文件和文档文件
if item.endswith('.json') or item in ['LICENSE.md', 'README.md', 'README']:
continue
src = os.path.join(root_dir, item)
dst = jingrow_backend_dir / item
if os.path.isdir(src):
if dst.exists():
shutil.rmtree(dst)
shutil.copytree(src, dst)
else:
shutil.copy2(src, dst)
# 同步文件到数据库 - 使用扩展包名称作为 app_name
try:
from jingrow.utils.jingrow_api import get_jingrow_api_headers
from jingrow.config import Config
import requests
api_url = f"{Config.jingrow_server_url}/api/action/jingrow.ai.utils.jlocal.sync_app_files"
requests.post(
api_url,
json={'app_name': app_name, 'app_path': str(jingrow_backend_dir), 'force': True},
headers=get_jingrow_api_headers(),
timeout=60
)
except Exception:
pass
return {'success': True, 'message': '扩展包已安装到 jingrow 应用', 'app_name': app_name}
def is_app_installed(app_name: str) -> bool:
"""检查应用是否已安装"""
apps_dir, _ = get_app_directories()
@ -294,6 +360,15 @@ def install_app(uploaded_file_path: str, app_name: str = None) -> Dict[str, Any]
package_info = analyze_result['data']
# 检查是否有 hooks.py
has_hooks = package_info.get('has_hooks', False)
if not has_hooks:
# 作为扩展包安装到 jingrow 应用内部
result = install_package(temp_dir, package_info)
cleanup_temp_dir(temp_dir)
return result
# 确定应用名称
if not app_name:
app_name = package_info.get('app_name')