Xcode生成的CoreData文件无法由复制Bundle资源构建阶段处理。

7
我将我的应用程序 MY_APP 添加了 CoreData:
  • 我通过创建一个包含单个实体XXX和一些属性的xcdatamodeld文件来定义数据模型。
  • 使用Xcode/Editor/Create NSManagedSubclass,Xcode创建了2个文件:XXX+CoreDataClass.swiftXXX+CoreDataProperties.swift
  • 我编写了一些代码来测试存储和从core data中获取返回,一切都正常。

问题:
在构建阶段开始时,我收到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目标/构建阶段/复制包资源下。
我的问题是:我的构建设置有什么问题吗?即这些警告的原因是什么,我该如何避免它?
备注:这个问题涉及到一个不同的框架(核心数据),但与this one类似,它还没有答案。
编辑:我的项目有2个目标,分别用于iOS和watchOS。直到现在,核心数据只用于iOS。
我现在尝试在watchOS上启用它,但我遇到了一个错误,因为.xcdatamodeld尚未出现在Build Phases / Copy Bundle Resources中。
一旦我在那里添加了它,核心数据就可以在手表上正确执行。
但是:我得到了相同的3个警告,这次还针对手表扩展目标(总共6个警告)。也许这是一个有用的提示。
3个回答

15
EDIT:

我联系了苹果公司,他们提供了一个解决方案:

当使用coreData选项创建名为“xxx”的Xcode项目时,会创建一个core data模型文件“xxx.xcdatamodeld”,并将其添加到目标生成阶段编译源代码中。例如,可以添加一个名为“Entity”的实体和一个名为“attribute”的属性。

如果在Xcode项目导航器中选择此模型文件并打开文件检查器,则会看到一个名为“代码生成”的条目,默认为Swift。这将自动创建2个文件Entity + CoreDataClass.swift和Entity + CoreDataProperties.swift,但是它们不会显示在项目导航器中。构建项目成功后,可以像往常一样在代码中使用属性Entity.attribute。

然而:
如果在Xcode导航器中选择xcdatamodeld文件,则Xcode编辑菜单中会有一个名为“创建NSManagedObject子类…”的条目。如果选择该条目,然后再选择xxx数据模型,将再次创建两个文件Entity+CoreDataClass.swift和Entity+CoreDataProperties.swift,并将它们默认添加到目标。这意味着这些文件被添加了两次,因此会出现警告。

因此,解决方案是不要使用此编辑命令,我不知道它是用来做什么的...

EDIT 2:

我的错;我看错了位置:

  • 在项目导航器中打开xcdatamodeld。
  • 在其右侧窗格中,选择一个实体。
  • 在右上方,打开检查器窗格。
  • 在其右上方,选择数据模型检查器。
  • 有一个名为“Codegen”的条目,可以选择手动/无。

如果选择了此选项,则不会从xcdatamodeld自动生成代码,即可以通过使用编辑器命令手动创建NSManagedObject子类,并将其添加到所需的目标编译源代码中。

先前的回答:

显然有两种使用CoreData的方法,其中一种是只使用PROJECT.xcdatamodeld文件,然后将其添加到Compile Sources Build Phase中,另一种是使用Xcode的Editor/Create NSManagedObject Subclass命令创建NSManagedObject子类。

如果使用第一种方法,则一切正常,但是没有属性访问实体。

如果使用第二种方法,则Xcode会创建2个文件ENTITY+CoreDataClass.swift和ENTITY+CoreDataProperties.swift。这两个文件都会被添加到Compile Sources Build Phase中,但PROJECT.xcdatamodeld就不可以添加进去了。如果添加进去,会出现构建错误“unexpected duplicate task”。如果不添加它,则项目可以无错地构建和运行。

let entity = NSEntityDescription.entity(forEntityName: "MyEntity", in: managedContext)! 

失败,因为它找不到数据模型。
一个解决方法是将PROJECT.xcdatamodeld添加到目标/构建阶段/复制包资源中。然后代码就可以正常执行了,但是会收到我在问题中描述的警告。


1
谢谢,我不小心将 Codegen 下拉菜单更改为“类定义”,其中一个实体正在困扰我,我找不到是什么原因导致这些警告。 - Mauricio Chirino
1
很高兴我能帮助到你! - Reinhard Männer

3
对我来说,造成问题的原因是在指定警告的目标中,在 Build Phases 中的 Copy Bundle Resources 步骤中具有 .xcdatamodeld 文件。 我从 Copy Bundle Resources 步骤中删除了该文件,所有警告都消失了。

1
正如我在自己的答案中提到的那样,从“复制包资源”中删除.xcdatamodeld确实会消除警告。然而,当我这样做时,NSPersistentContainer(name :)现在返回(在我的情况下)nil,因此无法使用核心数据。在你的情况下可以吗? - Reinhard Männer
啊,对不起我错过了那个细节。我没有构建一个手表,所以我没有处理过那个问题。这是为一个pod设计的,所以当这个代码被用作pod时,我可能会遇到类似的问题。感谢澄清; 我一定要注意这一点,并且很抱歉目前不能提供更多帮助。 - EndersJeesh

0

处理近年来每个版本都越来越多错误的Xcode方法:

  • 退出并重新启动Xcode。
  • 如果不行,在.xcodeproj包上做一个 Show Package Contents,然后在文本编辑器中打开.pbxproj文件。搜索文件,查找XXX+CoreDataClass的出现情况。在文件中搜索其他一些未创建此警告的.swift文件。比较这两个搜索结果。可能需要手动编辑.pbxproj文件。

退出并重新启动Xcode没有帮助。我犹豫是否要编辑.pbxproj文件,原因有两个:1)我不理解我将要做什么,2)我在.pbxproj中找到了我在问题中提到的前两个文件,但没有找到第三个文件。所以我猜想你的建议并不能完全解决问题。无论如何,还是谢谢! - Reinhard Männer
几个月前,我因为类似的原因不得不编辑一个 .pbxproj 文件。这并不难。每个项目(文件、目标、构建阶段等)都由一个24位十六进制标识符引用。该文件本质上是一堆看起来类似于 JSON 数组的列表。当然,只有在退出 Xcode 时才能编辑该文件。如果你搞砸了什么,它就无法打开 - 请使用备份再试一次。至于第三个文件没有出现在 .pbxproj 文件中但仍然出现在用户界面中,我认为这是不可能的。无论如何,如果您在不编辑 .pbxproj 的情况下成功,请发布您的答案! - Jerry Krinock
我在 project.pbxproj 中搜索包含 +CodeData 的任何内容,因为这是警告中提到的所有3个文件的一部分:
  • PBXBuildFile 部分包含 MY_APP+CoreDataClass.swiftMY_APP+CoreDataProperties.swift,但两个条目都重复了。
  • 它不包含 MY_APP+CoreDataModel.swift。 由于发现相同的条目被重复包含很奇怪,我删除了每个副本中的一个。这导致除了警告之外还出现了构建错误。 然后我搜索了 MY_APP+CoreDataModel.swift,并像其他2个文件一样在派生数据中找到了它。
- Reinhard Männer
复制并搜索与“好”文件相关联的16位十六进制数字。然后,重复此步骤以搜索其中一个“坏”文件。最后,比较这两个搜索结果。 - Jerry Krinock

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接