【问题标题】:Duplicate files in DerivedData folder using CoreData generator使用 CoreData 生成器在 DerivedData 文件夹中复制文件
【发布时间】:2016-11-06 12:27:24
【问题描述】:

我正在尝试从我的数据模型生成 NSManagedModels。生成工作,但在我遇到很多错误之后:

错误:文件名“Station+CoreDataProperties.swift”使用了两次: '/Users/Me/MyApp/Models/CoreData/Station+CoreDataProperties.swift' 和 '/Users/Me/Library/Developer/Xcode/DerivedData/MyApp-gwacspwrsnabomertjnqfbuhjvwc/Build/Intermediates/MyApp.build/Debug-iphoneos/MyApp.build/DerivedSources/CoreDataGenerated/Model/Station+CoreDataProperties.swift' :0: 注意:文件名用于区分私有 同名声明

我尝试清理构建文件夹和派生数据目录硬删除。我正在使用 Xcode 8 BETA 也许这是一个错误?

【问题讨论】:

  • 尝试删除派生数据,Xcode -> 文件 -> 项目设置。
  • @AlvinVarghese Lit 我在帖子中说过硬删除不起作用!谢谢
  • 检查你的项目目录再次检查Station+CoreDataProperties.swift不存在两次。
  • 你在使用cocoapods吗?如果是,则必须在 podfile 中指定 use_frameworks! 并重新构建它。

标签: core-data swift3 xcode8


【解决方案1】:

这不是错误。 Codegen 在 DerivedData 文件夹中生成这些文件,因此您无需在项目中再次创建它们,因此会出现编译错误。

来自 Xcode 8.0 发行说明:

Xcode 自动为 Core Data 数据模型中的实体和属性生成类或类扩展。自动代码生成在逐个实体的基础上启用和禁用,并且为使用 Xcode 8 文件格式的新模型中的所有实体启用。此功能适用于已升级到 Xcode 8 格式的任何数据模型。您可以使用数据模型的文件检查器指定 Xcode 是为数据模型生成 Swift 还是 Objective-C 代码。

当为实体启用自动代码生成时,Xcode 会创建 实体中指定的类或类扩展 实体的检查员:使用指定的类名和来源 放置在项目的派生数据中。对于 Swift 和 Objective-C,这些类可以直接从项目的 代码。对于 Objective-C,会为所有文件创建一个额外的头文件 在您的模型中生成实体。头文件名符合 命名约定“DataModelName+CoreDataModel.h”。

但是,如果您在数据模型检查器的 codegen 下拉菜单中选择 Category/Extension(因为您想为模型添加逻辑):codegen 将错误地生成两个类定义和属性扩展

解决方案是简单地删除属性扩展名(ClassName+CoreDataProperties.swift)。您的项目现在应该可以编译了。

【讨论】:

  • 请查看 Apple Bug Reporter 并再次阅读我的帖子! Apple 在 8.1 中解决了这个问题。
【解决方案2】:

这确实不是错误。正如@Morrowless 建议的那样,创建了类定义和属性扩展。如果不想这样做,请选择 Codegen 下的Manual/None生成代码之前。如果代码已经生成,只需删除它们,然后从菜单中再次尝试Editor->Create NSManagedObject Subclass...(设置手动/无后)。

请注意,在下图中,类名称“联系人”特定于我的项目。您将看到您的实体名称。

【讨论】:

  • 请查看 Apple Bug Reporter 并再次阅读我的帖子! Apple 在 8.1 中解决了这个问题。
  • 刚下载8.1。在我的模型中添加了一个 TestEntity 并添加了两个属性,String 和 Date,并从菜单中创建了 NSManagedObjectSubclass。不出所料,我仍然得到错误,因为这首先不是一个错误。我上面的解决方案有效并解决了问题。您需要将Module 设置为Current Product ModuleCodegen 设置为Manual/None
  • 在我的项目中设置了手册,更新到 8.1 解决了我的问题。查看错误跟踪器。但是你是对的,如果用户没有设置手动模式,那不是错误 :)
【解决方案3】:

我在 Xcode 8.1 中得到了这个 对我来说,以下步骤解决了这个问题。请注意顺序很重要。

1) 在核心数据模型中创建实体。

2) 在类部分,如下图进行设置。

模块:当前产品名称

代码生成:手动/无

3) 生成您的 NSManagedObject 子类。

【讨论】:

  • 对于其他人,如果您的 Core Data 模型在嵌入式框架中,您需要将 Module 设置为 Global 否则您最终会编译两个版本的子类(自动由 Xcode 生成的,以及您定义的)。 当您进行此更改时,请确保您也重新创建您的子类! 如果您不这样做,您最终会遇到错误。
  • 太棒了。节省时间。
【解决方案4】:

在遵循 oyalhi 和 Vladimir Shutyuk 的指导后(删除 NSManagedObject 文件,将实体 codegen 更改为 Manual/None),我必须重新启动 Xcode 以使其再次建立索引,然后才能重新生成NSManagedObject 文件并成功编译。

【讨论】:

    【解决方案5】:

    这篇文章极大地帮助我自己解决了这个问题。我个人认为这是一个 Xcode 错误。不管有没有错误,这是一个巨大的鸡和蛋的情况。

    我遇到了这个:

    1. 使用 Core Data 创建了一个新项目
    2. 生成了我的NSManagedObject 子类+扩展(而codegen: ClassDefinition
    3. 我不小心将生成的类保存在了 Wrong 文件夹中
    4. 我删除了生成的文件
    5. 在我想要的文件夹中重新生成
    6. ?- Xcode used twice 错误

    正如其他人发布的那样,我一直在清理我的构建(和clean build folder),但这从未解决构建问题。

    我终于知道你最初是否使用codegen: ClassDefinition 创建了你的NSManagedObject 生成的类,正如我所做的那样,我不知道然后你被锁定在鸡和蛋的问题上。

    然后我删除了自动生成的类思考我必须重新生成,所以我这样做了。重新生成后,我会再次收到 used twice 构建错误。我手动进入../DerivedSources/CoreDataGenerated/Model/.. 并删除了重复项。再次,我重新生成了我的想法,我只有 1 个副本(在我的项目中),但我错了。如果最初设置了codegen: ClassDefinition,那么Xcode 将继续创建auto-generated 类+扩展并将它们放在隐藏的文件夹../DerivedSources/CoreDataGenerated/Model/.. 中。我把这个鸡和蛋重复了几次,然后才开始流行。

    我后来意识到你确实需要标记 codegen: Manual/None 但是要让事情恢复同步,你需要删除 ../DerivedSources/CoreDataGenerated/Model/.. 和你的项目中的自动生成的文件,如果你还有的话。

    小心设置codegen: Manual/None,对我来说这有点棘手,因为codegen: Manual/None 不会粘住。我不得不多次在实体之间来回单击以双重/三重检查每个实体是否设置为codegen: Manual/None然后自动生成文件。此时,自动生成文件的唯一副本应该在您的项目中,而不是在 ../DerivedSources/CoreDataGenerated/Model/.. 中。

    最后,我认为这是一个错误,因为如果您指定 codegen: Manual/None 我根本不希望 Xcode 自动生成文件,但它会自动生成文件并将它们放入您的项目中。如果你的设置是codegen: ClassDefinition 会更令人困惑,谁知道 Xcode 会将文件放在一个隐藏的目录中,但它可以在你的项目中使用。我对此感到不满的是自动生成的文件不受源代码控制,如果我更换计算机,我必须知道在新站上自动生成它们。

    希望这对其他人有帮助!

    干杯!

    【讨论】:

      【解决方案6】:

      如果您使用 codegen: ClassDefinition 生成 CoreData 子类,您基本上就搞砸了。修复它的唯一方法是:

      1. 删除您的 CoreData 子类。
      2. 删除您的派生数据文件夹。
      3. 清理您的项目 (CMD+K)。
      4. 生成新的CoreData子类,这次选择Codegen: Manual/NoneModule: Current Product Module

      【讨论】:

      • 他没有被搞砸。删除DerivedData,将每个实体的“Codegen”属性更改为Manual/None,然后清理和构建就可以了。无需删除并重新创建 CoreData 子类。
      【解决方案7】:

      为了完整起见..:

      我刚刚遇到了同样的错误,但建议的解决方案都没有奏效。让我感到困惑的是,即使对于(我认为的)有问题的实体从自动代码生成切换到手动生成,也没有任何作用。

      最后,我发现我有几个具有相同 name 的实体,但它们都共享相同的 classname。这样做的原因是我多次复制和粘贴一个实体以节省一些工作,因为它们也有一些共同的属性。

      原来 XCode 通过将 1, 2,... 添加到实体名称来重命名重复项,但保留类名称与以前一样。由于现在实体名和类名是“不相关的”,重命名实体也不会改变类名。

      希望它对某人有所帮助 - 我也为此提交了错误报告。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-04-19
        • 2022-07-06
        • 2011-10-20
        • 1970-01-01
        • 2014-06-21
        • 1970-01-01
        • 2014-11-18
        相关资源
        最近更新 更多