#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ NPM 打包和复制模块 """ import os import subprocess import shutil from pathlib import Path from .log import Logger def run_npm(work_dir, npm_commands, source_dir, target_dir): """ 执行 NPM 打包和复制 参数: work_dir: 执行 npm 命令的目录 npm_commands: 执行的命令(字符串) source_dir: 复制的源目录 target_dir: 复制的目标目录 返回: tuple: (success: bool, error_message: str) 成功返回 (True, ""),失败返回 (False, "错误信息") """ try: # 转换为绝对路径 work_dir = Path(work_dir).resolve() Logger.separator() Logger.info("开始 NPM 打包") Logger.separator() Logger.info(f"执行目录: {work_dir}") Logger.info(f"NPM 命令: {npm_commands}") # 检查目录是否存在 if not work_dir.exists(): error_msg = f"目录不存在: {work_dir}" Logger.error(error_msg) return False, error_msg # 执行 NPM 命令 if not Logger.run_command(npm_commands, work_dir): error_msg = "NPM/PNPM 编译失败,请查看日志获取详细错误信息" Logger.error(error_msg) return False, error_msg Logger.info("NPM 打包成功") # 复制构建产物 Logger.separator() Logger.info("开始复制构建产物") Logger.separator() source_full_path = work_dir / source_dir Logger.info(f"源目录: {source_full_path}") Logger.info(f"目标目录: {target_dir}") # 检查源目录是否存在 if not source_full_path.exists(): error_msg = f"源目录不存在: {source_full_path}" Logger.error(error_msg) return False, error_msg # 清空目标目录(保留 .gitkeep) target_path = Path(target_dir) if target_path.exists(): Logger.info(f"清空目标目录: {target_dir}") for item in target_path.iterdir(): if item.name != '.gitkeep': if item.is_dir(): shutil.rmtree(item) else: item.unlink() else: target_path.mkdir(parents=True, exist_ok=True) # 复制目录内容 Logger.info(f"复制目录内容...") for item in source_full_path.iterdir(): dest = target_path / item.name if item.is_dir(): shutil.copytree(item, dest, dirs_exist_ok=True) else: shutil.copy2(item, dest) Logger.info("构建产物复制成功") Logger.info("NPM 打包和复制完成") return True, "" except Exception as e: error_msg = f"NPM 打包异常: {str(e)}" Logger.error(error_msg) return False, error_msg