Xcode 复制捆绑资源构建阶段无法处理生成的 CoreData 文件
Xcode generated CoreData files cannot be processed by Copy Bundle Resources build phase
我将 CoreData 添加到我的应用程序 MY_APP
:
- 我通过创建一个包含以下内容的
xcdatamodeld
文件来定义数据模型
具有一些属性的单个实体 XXX
。
- 使用 Xcode/Editor/Create NSManagedSubclass,Xcode 创建了 2 个文件,
XXX+CoreDataClass.swift
和 XXX+CoreDataProperties.swift
。
- 我写了一些代码来测试存储和从核心数据中取回,一切正常。
问题:
在构建阶段开始时,我收到 3 条警告:
warning: The Swift file "/Users/reiner/Library/Developer/Xcode/DerivedData/
MY_APP/Build/Intermediates.noindex/MY_APP.build/Debug-iphonesimulator/
MY_APP.build/DerivedSources/CoreDataGenerated/MY_APP/XXX+CoreDataClass.swift"
cannot be processed by a Copy Bundle Resources build phase (in target ‚MY_APP‘)
warning: The Swift file "/Users/reiner/Library/Developer/Xcode/DerivedData/
MY_APP/Build/Intermediates.noindex/MY_APP.build/Debug-iphonesimulator/
MY_APP.build/DerivedSources/CoreDataGenerated/MY_APP/XXX+CoreDataProperties.swift"
cannot be processed by a Copy Bundle Resources build phase (in target 'MY_APP')
warning: The Swift file "/Users/reiner/Library/Developer/Xcode/DerivedData/
MY_APP/Build/Intermediates.noindex/MY_APP.build/Debug-iphonesimulator/
MY_APP.build/DerivedSources/CoreDataGenerated/MY_APP/MY_APP+CoreDataModel.swift"
cannot be processed by a Copy Bundle Resources build phase (in target 'MY_APP')
这 3 个文件未在 MY_APP target/Build Phases/Copy 捆绑资源下列出。
我的问题:
我的构建设置有什么问题吗,即这些警告的原因是什么,我该如何避免?
备注:此问题涉及不同的框架(核心数据),但类似于this one,目前还没有答案。
编辑:
我的项目有 2 个目标,分别用于 iOS 和 watchOS。到目前为止,核心数据仅用于 iOS.
我现在也尝试为 watchOS 启用它,但出现错误,因为 .xcdatamodeld
尚未在构建阶段/复制捆绑资源中。
一旦我将它添加到那里,核心数据就会在手表上正确执行。
但是: 我收到了上面提到的相同的 3 个警告,这次是针对 watch 扩展目标(总共 6 个警告)。
也许这是一个有用的提示。
一种处理 Xcode 的方法,近年来每个版本的错误似乎越来越多:
- 退出并重新启动 Xcode。
- 如果这不起作用,请对
.xcodeproj
包执行 显示包内容 并在文本编辑器中打开 .pbxproj
文件。在文件中搜索 XXX+CoreDataClass
。在文件中搜索未出现此警告的其他 .swift
文件。比较两个搜索结果。可能需要手动编辑 .pbxproj
文件。
编辑:
我联系了 Apple,他们提供了解决方案:
当使用 coreData 选项创建 Xcode 项目“xxx”时,将创建核心数据模型文件“xxx.xcdatamodeld”并将其添加到目标构建阶段编译源中。
比如说,在那里添加一个具有属性“属性”的实体“实体”。
如果 Xcode 项目导航器中的一个 selects 这个模型文件并打开文件检查器,有一个条目“代码生成”,默认设置为 Swift .这会自动创建 2 个文件 Entity+CoreDataClass.swift 和 Entity+CoreDataProperties.swift,但它们不会显示在项目导航器中。
构建项目成功,可以在代码中像往常一样使用属性 Entity.attribute。
然而:
如果在 Xcode 导航器中 selects xcdatamodeld 文件,Xcode 编辑器菜单有一个条目“Create NSManagedObject Subclass…”。如果一个 selects 此条目和 xxx 数据模型,将再次创建 2 个文件 Entity+CoreDataClass.swift 和 Entity+CoreDataProperties.swift 并显示在项目导航器中,并默认添加到目标.
这意味着这些文件被添加了两次,因此出现了警告。
所以解决方法是不要使用这个编辑器命令,我也不知道它是干嘛的...
编辑 2:
我的错;我看错地方了:
- 在项目导航器中打开 xcdatamodeld。
- 在它右边的窗格中,select 一个实体。
- 在右上角,打开检查器窗格。
- 在它的右上角,select 数据模型检查器。
- 有一个条目“Codegen”,其中可以 select Manual/None。
如果此选项被 selected,则不会从 xcdatamodeld 自动生成代码,即可以手动(通过使用编辑器命令)创建 NSManagedObject 子类,这些子类可以添加到目标编译源部分,根据需要。
上一个回答:
显然有 2 种使用 CoreData 的方法,要么 1) 仅使用 PROJECT.xcdatamodeld
文件,然后将其添加到 Compile Sources Build Phase,要么 2 ) 通过使用 Xcode 的 Editor/Create NSManagedObject Subclass 命令创建 NSManagedObject
子类。
如果使用 1),则一切正常,但无法 属性 访问所使用的实体。
如果使用 2),Xcode 会创建 2 个文件 ENTITY+CoreDataClass.swift
和 ENTITY+CoreDataProperties.swift
。这 2 个文件被添加到编译源构建阶段,但PROJECT.xcdatamodeld
不能。不管怎样,如果有人这样做,就会得到构建错误“意外的重复任务”。但如果没有,项目构建时不会出现错误和警告。
但是,当运行时,指令
let entity = NSEntityDescription.entity(forEntityName: "MyEntity", in: managedContext)!
失败,因为它没有找到数据模型。
解决方法是将 PROJECT.xcdatamodeld
添加到 target/Build Phases/Copy Bundle Resources。然后代码执行正常,但会收到我在问题中描述的警告。
对我来说,导致问题的原因是 Build Phases
中 Copy Bundle Resources
步骤中的 .xcdatamodeld
文件针对警告中指定的目标:在您的情况下,MY_APP
.我从 Copy Bundle Resources
步骤中删除了该文件,所有警告都消失了。
我将 CoreData 添加到我的应用程序 MY_APP
:
- 我通过创建一个包含以下内容的
xcdatamodeld
文件来定义数据模型 具有一些属性的单个实体XXX
。 - 使用 Xcode/Editor/Create NSManagedSubclass,Xcode 创建了 2 个文件,
XXX+CoreDataClass.swift
和XXX+CoreDataProperties.swift
。 - 我写了一些代码来测试存储和从核心数据中取回,一切正常。
问题:
在构建阶段开始时,我收到 3 条警告:
warning: The Swift file "/Users/reiner/Library/Developer/Xcode/DerivedData/
MY_APP/Build/Intermediates.noindex/MY_APP.build/Debug-iphonesimulator/
MY_APP.build/DerivedSources/CoreDataGenerated/MY_APP/XXX+CoreDataClass.swift"
cannot be processed by a Copy Bundle Resources build phase (in target ‚MY_APP‘)
warning: The Swift file "/Users/reiner/Library/Developer/Xcode/DerivedData/
MY_APP/Build/Intermediates.noindex/MY_APP.build/Debug-iphonesimulator/
MY_APP.build/DerivedSources/CoreDataGenerated/MY_APP/XXX+CoreDataProperties.swift"
cannot be processed by a Copy Bundle Resources build phase (in target 'MY_APP')
warning: The Swift file "/Users/reiner/Library/Developer/Xcode/DerivedData/
MY_APP/Build/Intermediates.noindex/MY_APP.build/Debug-iphonesimulator/
MY_APP.build/DerivedSources/CoreDataGenerated/MY_APP/MY_APP+CoreDataModel.swift"
cannot be processed by a Copy Bundle Resources build phase (in target 'MY_APP')
这 3 个文件未在 MY_APP target/Build Phases/Copy 捆绑资源下列出。
我的问题:
我的构建设置有什么问题吗,即这些警告的原因是什么,我该如何避免?
备注:此问题涉及不同的框架(核心数据),但类似于this one,目前还没有答案。
编辑:
我的项目有 2 个目标,分别用于 iOS 和 watchOS。到目前为止,核心数据仅用于 iOS.
我现在也尝试为 watchOS 启用它,但出现错误,因为 .xcdatamodeld
尚未在构建阶段/复制捆绑资源中。
一旦我将它添加到那里,核心数据就会在手表上正确执行。
但是: 我收到了上面提到的相同的 3 个警告,这次是针对 watch 扩展目标(总共 6 个警告)。
也许这是一个有用的提示。
一种处理 Xcode 的方法,近年来每个版本的错误似乎越来越多:
- 退出并重新启动 Xcode。
- 如果这不起作用,请对
.xcodeproj
包执行 显示包内容 并在文本编辑器中打开.pbxproj
文件。在文件中搜索XXX+CoreDataClass
。在文件中搜索未出现此警告的其他.swift
文件。比较两个搜索结果。可能需要手动编辑.pbxproj
文件。
编辑:
我联系了 Apple,他们提供了解决方案:
当使用 coreData 选项创建 Xcode 项目“xxx”时,将创建核心数据模型文件“xxx.xcdatamodeld”并将其添加到目标构建阶段编译源中。
比如说,在那里添加一个具有属性“属性”的实体“实体”。
如果 Xcode 项目导航器中的一个 selects 这个模型文件并打开文件检查器,有一个条目“代码生成”,默认设置为 Swift .这会自动创建 2 个文件 Entity+CoreDataClass.swift 和 Entity+CoreDataProperties.swift,但它们不会显示在项目导航器中。
构建项目成功,可以在代码中像往常一样使用属性 Entity.attribute。
然而:
如果在 Xcode 导航器中 selects xcdatamodeld 文件,Xcode 编辑器菜单有一个条目“Create NSManagedObject Subclass…”。如果一个 selects 此条目和 xxx 数据模型,将再次创建 2 个文件 Entity+CoreDataClass.swift 和 Entity+CoreDataProperties.swift 并显示在项目导航器中,并默认添加到目标.
这意味着这些文件被添加了两次,因此出现了警告。
所以解决方法是不要使用这个编辑器命令,我也不知道它是干嘛的...
编辑 2:
我的错;我看错地方了:
- 在项目导航器中打开 xcdatamodeld。
- 在它右边的窗格中,select 一个实体。
- 在右上角,打开检查器窗格。
- 在它的右上角,select 数据模型检查器。
- 有一个条目“Codegen”,其中可以 select Manual/None。
如果此选项被 selected,则不会从 xcdatamodeld 自动生成代码,即可以手动(通过使用编辑器命令)创建 NSManagedObject 子类,这些子类可以添加到目标编译源部分,根据需要。
上一个回答:
显然有 2 种使用 CoreData 的方法,要么 1) 仅使用 PROJECT.xcdatamodeld
文件,然后将其添加到 Compile Sources Build Phase,要么 2 ) 通过使用 Xcode 的 Editor/Create NSManagedObject Subclass 命令创建 NSManagedObject
子类。
如果使用 1),则一切正常,但无法 属性 访问所使用的实体。
如果使用 2),Xcode 会创建 2 个文件 ENTITY+CoreDataClass.swift
和 ENTITY+CoreDataProperties.swift
。这 2 个文件被添加到编译源构建阶段,但PROJECT.xcdatamodeld
不能。不管怎样,如果有人这样做,就会得到构建错误“意外的重复任务”。但如果没有,项目构建时不会出现错误和警告。
但是,当运行时,指令
let entity = NSEntityDescription.entity(forEntityName: "MyEntity", in: managedContext)!
失败,因为它没有找到数据模型。
解决方法是将 PROJECT.xcdatamodeld
添加到 target/Build Phases/Copy Bundle Resources。然后代码执行正常,但会收到我在问题中描述的警告。
对我来说,导致问题的原因是 Build Phases
中 Copy Bundle Resources
步骤中的 .xcdatamodeld
文件针对警告中指定的目标:在您的情况下,MY_APP
.我从 Copy Bundle Resources
步骤中删除了该文件,所有警告都消失了。