You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让SwiftUI Previews忽略特定文件以避免重复构建?

问题

我们的SwiftUI项目里包含一个MLPackage文件,每次加载View预览时,Xcode都会陷入「Build for Previews」无限循环——构建完成后立刻启动新一轮构建,根本没法正常查看或使用预览。

查看控制台日志(非Xcode内置日志)显示:

Xcode (PreviewsPipeline)
=== Requesting updating previews for reasons [
    File "foo.mlpackage" changed,
    Preview Settings changed,
]

把模型完全移出项目就能解决问题,所以可以确定是MLPackage导致的。我们编译时会对模型加密,但Debug构建已经禁用了这个功能,甚至完全移除加密步骤也没用。

我知道mlpackage包含元数据、描述拓扑结构的.mlmodel文件,还有存储神经网络权重的压缩weights.bin文件。推测是运行时的预编译或解压操作修改了这个包/文件,导致被检测为已更改,进而触发预览重建循环。

想问下有没有办法让SwiftUI Previews忽略特定文件、目录或模式?这样就算mlpackage文件变化,也不会触发预览重建。

设备:M1 Mac Mini,Xcode 14.2 (14C18)

可行解决方案
  • 锁定MLPackage文件,禁止写入
    既然推测是运行时操作修改了mlpackage内容,先尝试把整个mlpackage文件夹设为只读:

    1. 在Finder里找到项目中的foo.mlpackage
    2. 右键选择「显示简介」,勾选底部的「锁定」,或者在「共享与权限」面板把所有用户的权限设为「只读」
    3. 回到Xcode重启预览,检查是否还会触发循环
  • 将MLPackage移至项目外,通过路径加载
    把mlpackage从项目目录中移出,放到项目外的固定路径,代码中通过绝对路径或相对路径加载模型,而非作为项目资源加入。这样Xcode预览系统不会监控该文件的变化。

  • 添加预览专属构建脚本,跳过模型修改
    在Xcode的「Build Phases」中新增一个Run Script,通过环境变量判断是否为预览构建,跳过任何可能修改mlpackage的操作:

    if [ "$ENABLE_PREVIEWS" = "YES" ]; then
        echo "Skipping ML model modifications for previews"
        exit 0
    fi
    # 原有的模型处理脚本代码放在这里
    
  • 手动修改项目文件,排除预览监控
    Xcode支持通过项目配置排除特定文件的预览监控,需要手动编辑项目文件:

    1. 关闭Xcode,右键项目文件选择「显示包内容」,打开project.pbxproj
    2. 找到对应foo.mlpackage的文件条目,在其属性中添加EXCLUDED_FROM_PREVIEWS = YES;
    3. 保存后重新打开Xcode,预览将不再监控该文件的变化

内容的提问来源于stack exchange,提问作者Nate Lowry

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 12:50:20