优化应用安装逻辑

This commit is contained in:
jingrow 2025-10-26 22:42:29 +08:00
parent 916ec1b69c
commit e9fafbc969

View File

@ -120,7 +120,7 @@ def analyze_package(temp_dir: str) -> Dict[str, Any]:
@handle_errors @handle_errors
def install_files(temp_dir: str, app_name: str, package_info: Dict[str, Any], is_backend: bool) -> Dict[str, Any]: def install_files(temp_dir: str, app_name: str, package_info: Dict[str, Any], is_backend: bool) -> Dict[str, Any]:
"""安装文件到指定目录""" """安装文件到指定目录 - 直接复制整个目录结构,更简单高效"""
apps_dir, _ = get_app_directories() apps_dir, _ = get_app_directories()
app_dir = apps_dir / app_name app_dir = apps_dir / app_name
@ -129,60 +129,60 @@ def install_files(temp_dir: str, app_name: str, package_info: Dict[str, Any], is
shutil.rmtree(app_dir) shutil.rmtree(app_dir)
app_dir.mkdir(parents=True, exist_ok=True) app_dir.mkdir(parents=True, exist_ok=True)
# 创建app_name和frontend子目录
backend_dir = app_dir / app_name
frontend_dir = app_dir / "frontend"
backend_dir.mkdir(parents=True, exist_ok=True)
frontend_dir.mkdir(parents=True, exist_ok=True)
# 获取根目录 # 获取根目录
root_dir = package_info.get('root_dir', temp_dir) root_dir = package_info.get('root_dir', temp_dir)
copied_files = []
# 复制后端文件 # 直接复制整个目录结构
if package_info.get('has_backend', False): if package_info.get('has_backend', False):
for file_path in package_info.get('backend_files', []): backend_dir = app_dir / app_name
# file_path 是相对于 root_dir 的路径 backend_dir.mkdir(parents=True, exist_ok=True)
# 例如jin/hooks.py
# root_dir 是 tmp/app_install_xxx/jin
# 所以 src_path = tmp/app_install_xxx/jin/jin/hooks.py
src_path = os.path.join(root_dir, file_path)
# dst_path 需要去掉 app_name 前缀 # 检查 root_dir 下是否有 app_name 子目录解压后可能有两层app_name
if file_path.startswith(f"{app_name}/"): inner_app_dir = os.path.join(root_dir, app_name)
dst_path = backend_dir / file_path[len(app_name) + 1:] if os.path.exists(inner_app_dir) and os.path.isdir(inner_app_dir):
else: # 如果存在内层 app_name 目录,复制它
dst_path = backend_dir / file_path log_info(f"复制内层应用目录: {inner_app_dir} -> {backend_dir}")
for item in os.listdir(inner_app_dir):
src = os.path.join(inner_app_dir, item)
dst = backend_dir / item
if os.path.isdir(src):
shutil.copytree(src, dst, dirs_exist_ok=True)
else:
shutil.copy2(src, dst)
else:
# 否则直接复制 root_dir
log_info(f"复制应用目录: {root_dir} -> {backend_dir}")
for item in os.listdir(root_dir):
# 跳过不需要的文件
if item in ['__pycache__', '.git']:
continue
src = os.path.join(root_dir, item)
dst = backend_dir / item
if os.path.isdir(src):
shutil.copytree(src, dst, dirs_exist_ok=True)
else:
shutil.copy2(src, dst)
if os.path.exists(src_path): # 复制前端目录
dst_path.parent.mkdir(parents=True, exist_ok=True)
shutil.copy2(src_path, dst_path)
copied_files.append(str(dst_path))
else:
log_error(f"源文件不存在: {src_path}, root_dir={root_dir}, file_path={file_path}")
# 复制前端文件
if package_info.get('has_frontend', False): if package_info.get('has_frontend', False):
for file_path in package_info.get('frontend_files', []): frontend_dir = app_dir / "frontend"
src_path = os.path.join(root_dir, file_path) frontend_dir.mkdir(parents=True, exist_ok=True)
# dst_path 需要去掉 app_name 前缀 frontend_src = os.path.join(root_dir, "frontend")
if file_path.startswith(f"{app_name}/"): if os.path.exists(frontend_src):
dst_path = frontend_dir / file_path[len(app_name) + 1:] log_info(f"复制前端目录: {frontend_src} -> {frontend_dir}")
else: for item in os.listdir(frontend_src):
dst_path = frontend_dir / file_path src = os.path.join(frontend_src, item)
dst = frontend_dir / item
if os.path.exists(src_path): if os.path.isdir(src):
dst_path.parent.mkdir(parents=True, exist_ok=True) shutil.copytree(src, dst, dirs_exist_ok=True)
shutil.copy2(src_path, dst_path) else:
copied_files.append(str(dst_path)) shutil.copy2(src, dst)
else:
log_error(f"源文件不存在: {src_path}, root_dir={root_dir}, file_path={file_path}")
return { return {
'success': True, 'success': True,
'app_dir': str(app_dir), 'app_dir': str(app_dir),
'copied_files': copied_files 'copied_files': ['...'] # 目录复制不记录单个文件
} }