核心摘要:在 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.path 和 DEVELOPER_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
使用方法
- 给脚本执行权限:
chmod +x compile_coredata.sh。 - 每次修改了数据模型或执行了 Clean Build 后,运行一次该脚本:
./compile_coredata.sh。 - 现在运行
swift test或在 VSCode 中点击“测试”按钮,Core Data 就能正确加载模型了。
效果演示
配置完成后,VSCode 的测试面板即可正常运行涉及 Core Data 的单元测试: