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

推荐订阅源

P
Proofpoint News Feed
H
Hacker News: Front Page
C
CXSECURITY Database RSS Feed - CXSecurity.com
C
Cisco Blogs
P
Palo Alto Networks Blog
Know Your Adversary
Know Your Adversary
D
Darknet – Hacking Tools, Hacker News & Cyber Security
C
Cybersecurity and Infrastructure Security Agency CISA
AWS News Blog
AWS News Blog
Spread Privacy
Spread Privacy
S
Schneier on Security
The Hacker News
The Hacker News
Cyberwarzone
Cyberwarzone
T
Tenable Blog
C
Cyber Attacks, Cyber Crime and Cyber Security
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
T
Tailwind CSS Blog
S
Secure Thoughts
N
Netflix TechBlog - Medium
T
The Exploit Database - CXSecurity.com
I
Intezer
Application and Cybersecurity Blog
Application and Cybersecurity Blog
Help Net Security
Help Net Security
K
Kaspersky official blog
Google Online Security Blog
Google Online Security Blog
L
LangChain Blog
Martin Fowler
Martin Fowler
L
LINUX DO - 热门话题
Hacker News: Ask HN
Hacker News: Ask HN
www.infosecurity-magazine.com
www.infosecurity-magazine.com
有赞技术团队
有赞技术团队
P
Privacy International News Feed
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Recent Announcements
Recent Announcements
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
The Register - Security
The Register - Security
云风的 BLOG
云风的 BLOG
Google DeepMind News
Google DeepMind News
阮一峰的网络日志
阮一峰的网络日志
WordPress大学
WordPress大学
Recorded Future
Recorded Future
The Last Watchdog
The Last Watchdog
G
Google Developers Blog
T
Threatpost
小众软件
小众软件
S
Securelist
Recent Commits to openclaw:main
Recent Commits to openclaw:main
O
OpenAI News

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

当灵感跑在了结果前面 -- 肘子的 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 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 开发技巧,加入众多开发者的行列。

立即订阅