diff --git a/backend/services/build_service.py b/backend/services/build_service.py index 92d4f2c..607b4ef 100644 --- a/backend/services/build_service.py +++ b/backend/services/build_service.py @@ -675,7 +675,12 @@ async def generate_config(task_id: str, task, build_dir: Path) -> dict: skin_extract_dir.mkdir(exist_ok=True) with zipfile.ZipFile(skin_zip, "r") as zf: zf.extractall(skin_extract_dir) - entries = list(skin_extract_dir.iterdir()) + # 过滤掉 macOS 压缩产生的 __MACOSX 及隐藏文件,避免把它们 + # 当成皮肤资源目录一起复制进 Images.xcassets。 + entries = [ + e for e in skin_extract_dir.iterdir() + if e.name != "__MACOSX" and not e.name.startswith(".") + ] if len(entries) == 1 and entries[0].is_dir(): config_data["THEME"] = str(entries[0]) else: diff --git a/backend/services/project_patcher.py b/backend/services/project_patcher.py index 47e0c57..2948e2d 100644 --- a/backend/services/project_patcher.py +++ b/backend/services/project_patcher.py @@ -68,6 +68,9 @@ def _apply_theme(build_dir: Path, theme_dir: str, messages: list[str]): for item in source.iterdir(): if not item.is_dir(): continue + # 跳过 macOS 压缩包内的 __MACOSX 及隐藏目录,仅复制真实皮肤资源 + if item.name == "__MACOSX" or item.name.startswith("."): + continue destination = target_assets / item.name if destination.exists(): shutil.rmtree(destination)