惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - 司徒正美
T
The Blog of Author Tim Ferriss
F
Fortinet All Blogs
Martin Fowler
Martin Fowler
罗磊的独立博客
The GitHub Blog
The GitHub Blog
L
LangChain Blog
A
About on SuperTechFans
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
D
DataBreaches.Net
宝玉的分享
宝玉的分享
U
Unit 42
阮一峰的网络日志
阮一峰的网络日志
Last Week in AI
Last Week in AI
N
Netflix TechBlog - Medium
The Cloudflare Blog
Microsoft Azure Blog
Microsoft Azure Blog
H
Help Net Security
美团技术团队
大猫的无限游戏
大猫的无限游戏
雷峰网
雷峰网
爱范儿
爱范儿
酷 壳 – CoolShell
酷 壳 – CoolShell
MongoDB | Blog
MongoDB | Blog

肘子的 Swift 记事本 | Fatbobman's Blog

iPhone Duo 带来的机遇与挑战 -- 肘子的 Swift 周报 #153 当 Mac mini 的价格不再 mini -- 肘子的 Swift 周报 #152 SwiftData:优化从建模开始 举手之劳 -- 肘子的 Swift 周报 #151 从使用 AI 到委托 AI(下):我想要的可委托性 AI 想放弃了,人没有 -- 肘子的 Swift 周报 #150 从使用 AI 到委托 AI:我的一些思考 越来越慢的 App Review,拦住了谁? -- 肘子的 Swift 周报 #149 ContentBuilder 解析:SwiftUI 类型检查性能提升的秘密 Apple Intelligence 已通过中国政府审核,即将在中国提供服务 -- 肘子的 Swift 周报 #148 在 SwiftUI Text 中控制孤行:挖掘未公开的 avoidsOrphans 热茶还是冰咖啡 -- 肘子的 Swift 周报 #147 Liquid Glass:UIKit 适配踩坑实录 不是模型变慢了,是任务变大了 -- 肘子的 Swift 周报 #146 当灵感跑在了结果前面 -- 肘子的 Swift 周报 #145 当每一次写入都有了新价格 -- 肘子的 Swift 周报 #144 当 Linux 成为“空气”:容器、Agent 与不再重要的“桌面之争” -- 肘子的 Swift 周报 #143 两个 SwiftUI 动画 Bug 排查小记 SPI 加入 Apple,Swift 迈向自举 -- 肘子的 Swift 周报 #142 Swift 还让你 Excited 吗? -- 肘子的 Swift 周报 #141 从 Size Class 到可用空间,horizontalSizeClass 还可靠吗? WWDC 26:AI 帮你看完了,然后呢? -- 肘子的 Swift 周报 #140 WWDC 2026 初印象:符合预期,但更务实 -- 肘子的 Swift 周报 #139 Core Data + Observation:从属性级响应到心智解放 稳定 > 新功能 -- 肘子的 Swift 周报 #138 用自定义 Layout 化解 SwiftUI List 的行高与间距跳变 从社区路标到生态基石:Dave Verwer 的新篇章 -- 肘子的 Swift 周报 #137 消失的 WWDC 愿望单 -- 肘子的 Swift 周报 #136 CocoaPods 正在退场,SwiftPM 才刚到第二章 -- 肘子的 Swift 周报 #135 让 AI 从称手到称心 -- 肘子的 Swift 周报 #134
VSCode/Cursor 测试 Core Data:手动编译 xcdatamodeld 指南
东坡肘子 · 2025-04-15 · via 肘子的 Swift 记事本 | Fatbobman's Blog

Read in English

🔦

(更新于 )

核心摘要:在 VSCode 或 Cursor 中运行 Swift 测试时,Core Data 的 .xcdatamodeld 文件不会像在 Xcode 中那样自动编译为 .momd。这会导致单元测试因找不到模型文件而崩溃。解决方案是配置正确的工具链,并使用 xcrun momc 手动编译模型。

背景

随着 Swift 6 的发布,越来越多的开发者开始使用 VSCode 或 Cursor(基于 VSCode 的 AI 编辑器)进行服务端或跨平台 Swift 开发。然而,当涉及 Core Data 等苹果私有框架时,SPM(Swift Package Manager)在非 Xcode 环境下的构建流程存在缺失,最典型的问题就是资源文件编译缺失

第一步:配置 Xcode 工具链

虽然可以通过 swiftly 等工具安装开源版 Swift 工具链,但 Core Data 依赖于 macOS SDK。因此,必须强制 VSCode 使用 Xcode 自带的工具链。

1. 获取 Xcode 路径

在终端运行以下命令,确认 Xcode 的安装位置及 Swift 版本:

/usr/bin/swift -v
# 预期输出应包含:/Applications/Xcode.app/...

2. 修改 VSCode 设置

在项目根目录的 .vscode/settings.json 中,显式指定 swift.pathDEVELOPER_DIR 环境变量。

注意:请根据你的实际 Xcode 版本(如 Xcode 17.0)调整路径。

{
  "swift.path": "/usr/bin/",
  "swift.swiftEnvironmentVariables": {
    "DEVELOPER_DIR": "/Applications/Xcode.app" 
  },
  "lldb.library": "/Applications/Xcode.app/Contents/SharedFrameworks/LLDB.framework/Versions/A/LLDB",
  "lldb.launch.expressions": "native"
}

第二步:手动编译数据模型 (关键)

这是最容易被忽略的一步。在 Xcode 中,构建系统会自动调用 momc 编译器将 .xcdatamodeld 转换为运行时可读的 .momd 目录。在 VSCode 中,我们需要手动完成这一步。

即使你在 Package.swift 中声明了 resources: [.process(...)],SPM 也只会简单地复制 .xcdatamodeld 文件夹,而 Core Data 运行时无法识别源文件。

转换脚本 (compile_coredata.sh)

在项目根目录创建一个脚本文件,用于调用 xcrun momc

#!/bin/bash

# --- 配置区域 ---
PACKAGE_NAME="MyCoreDataProject"   # 你的 Package 名称
TARGET_NAME="DataHandler"          # 包含 Core Data 模型的 Target 名称
MODEL_NAME="MyModel"               # xcdatamodeld 的文件名(不含扩展名)
# ----------------

# 源文件路径
SOURCE_MODEL="Sources/$TARGET_NAME/Resources/$MODEL_NAME.xcdatamodeld"

# 目标路径:指向 SPM 的构建目录
# 注意:根据构建模式(debug/release)和架构可能需要调整路径通配符
TARGET_DIR=".build/arm64-apple-macosx/debug/${PACKAGE_NAME}_${TARGET_NAME}.bundle/$MODEL_NAME.momd"

if [ ! -d "$SOURCE_MODEL" ]; then
    echo "❌ Error: Source model file not found: $SOURCE_MODEL"
    exit 1
fi

echo "Compiling Core Data model..."
mkdir -p "$TARGET_DIR"

# 调用 Xcode 的 momc 编译器
xcrun momc "$SOURCE_MODEL" "$TARGET_DIR"

if [ $? -eq 0 ]; then
    echo "✅ Success! Model compiled to:"
    echo "   $TARGET_DIR"
else
    echo "❌ Compilation failed!"
    exit 1
fi

使用方法

  1. 给脚本执行权限:chmod +x compile_coredata.sh
  2. 每次修改了数据模型执行了 Clean Build 后,运行一次该脚本:./compile_coredata.sh
  3. 现在运行 swift test 或在 VSCode 中点击“测试”按钮,Core Data 就能正确加载模型了。

效果演示

配置完成后,VSCode 的测试面板即可正常运行涉及 Core Data 的单元测试:

延伸阅读

相关提示

订阅 Fatbobman 周报

每周精选 Swift 与 SwiftUI 开发技巧,加入众多开发者的行列。

立即订阅