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

推荐订阅源

freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
GbyAI
GbyAI
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 三生石上(FineUI控件)
美团技术团队
Last Week in AI
Last Week in AI
WordPress大学
WordPress大学
L
LangChain Blog
雷峰网
雷峰网
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
博客园 - 叶小钗
Engineering at Meta
Engineering at Meta
腾讯CDC
Recent Announcements
Recent Announcements
The Register - Security
The Register - Security
有赞技术团队
有赞技术团队
Blog — PlanetScale
Blog — PlanetScale
博客园 - Franky
博客园 - 司徒正美
The Cloudflare Blog
Google DeepMind News
Google DeepMind News
T
Tailwind CSS Blog
C
Check Point Blog
小众软件
小众软件
V
Visual Studio Blog
V
V2EX
F
Full Disclosure
J
Java Code Geeks
MongoDB | Blog
MongoDB | Blog
罗磊的独立博客
人人都是产品经理
人人都是产品经理
量子位
Apple Machine Learning Research
Apple Machine Learning Research
F
Fortinet All Blogs
Microsoft Security Blog
Microsoft Security Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
博客园 - 【当耐特】
博客园_首页
Y
Y Combinator Blog
N
Netflix TechBlog - Medium
酷 壳 – CoolShell
酷 壳 – CoolShell
Stack Overflow Blog
Stack Overflow Blog
Recorded Future
Recorded Future
G
Google Developers Blog
Vercel News
Vercel News
大猫的无限游戏
大猫的无限游戏
Microsoft Azure Blog
Microsoft Azure Blog
U
Unit 42
爱范儿
爱范儿
Jina AI
Jina AI

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

当每一次写入都有了新价格 -- 肘子的 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 Swift 并发正被更广泛地接纳 -- 肘子的 Swift 周报 #133 从 OpenSwiftUI 到 DanceUI:换个方式 Dive SwiftUI -- 肘子的 Swift 周报 #132 被 Vibe 摧毁的版权壁垒,与开发者的新护城河 -- 肘子的 Swift 周报 #131 苹果的罕见妥协:当高危漏洞遇上“拒升”潮 -- 肘子的 Swift 周报 #130 一墙之隔,不同的时空 -- 肘子的 Swift 周报 #129 我的 App 审核被卡了? -- 肘子的 Swift 周报 #128 CDE:一次让 Core Data 更像现代 Swift 的尝试 50 岁的苹果和 51 岁的我 -- 肘子的 Swift 周报 #127 2026 年,为什么我仍在思考 Core Data Macbook Neo:苹果重回校园的起点 -- 肘子的 Swift 周报 #126 跨域传递 NSManagedObjectContext 为什么在 Swift 6.2 中不再报错?真正的变化不在编译器 Xcode 26.3 + Claude Agent:模型替换、MCP、Skill 与自适应配置 macOS 录屏软件开发实录:从像素抓取到元数据重现 isolated(any) 与 #isolation:让 Swift 闭包自动继承隔离域 在 tvOS 上活下來:一個非典型播放器的工程實錄 告别“可移植汇编”:我已让 Swift 在 MCU 上运行七年 独立开发者的试炼:Zipic 从 0 到 1 的产品化之路 逃离 Mac App Store:如何从零构建独立应用的分发与售卖体系 为什么父视图无法修改子视图的 @State Partytown 实战:修复 GTM 自定义事件与 dataLayer 失效问题 Swift 6 编译加速:启用 Swift-Syntax 预构建 (Prebuilts) Swift 模块化:使用 package 关键字实现 Target 间安全共享 Monorepo 实战:解决 VSCode/Cursor 中 SwiftLint 配置失效问题
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 开发技巧,加入众多开发者的行列。

立即订阅