Дублировать файлы в папке DerivedData с использованием генератора CoreData
Я пытаюсь создать NSManagedModels из моего datamodel. Поколение работает, но после многих ошибок:
error: имя файла "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: примечание: имена файлов используются для объявления с тем же именем
Я пытаюсь очистить папку сборки и файл производногоData hard delete. Я использую Xcode 8 BETA, возможно, это ошибка?
Ответы
Ответ 1
Я получаю это в Xcode 8.1
Для меня следующие шаги решили проблему. Обратите внимание, что порядок имеет значение.
1) Создайте объект в модели Core Data.
2) В разделе класса сделайте настройки как на следующем изображении.
Модуль: текущее название продукта
Codegen: Manual/None
3) Создайте подкласс NSManagedObject.
![введите описание изображения здесь]()
Ответ 2
Этот пост очень помог мне решить эту проблему самостоятельно. Лично я рассматриваю это как ошибку Xcode. Ошибка или нет, это огромная ситуация с курицей и яйцом.
Я столкнулся с этим:
- Создал новый проект с использованием основных данных
- Сгенерирован мой подкласс
NSManagedObject
+ расширение (while codegen: ClassDefinition
)
- Я случайно сохранил сгенерированные классы в папке "Неправильно"
- Я удалил сгенерированные файлы
- Сгенерировано в папке, которую я хотел
- 💥- Ошибки Xcode
used twice
Как и другие публикации, я продолжал чистить мою сборку (и clean build folder
), но никогда не исправлял проблему сборки.
Наконец-то я понял, если вы изначально создали свои NSManagedObject
сгенерированные классы с помощью codegen: ClassDefinition
, как я и сделал, не зная, что вы заперты для проблемы с курицей и яйцом.
Затем я удалил автогенерированные классы, которые мне пришлось перегенерировать, поэтому я и сделал. После повторного создания я снова получаю ошибку сборки used twice
. Я вручную перешел в ../DerivedSources/CoreDataGenerated/Model/..
и удалил дубликаты. Опять же, я снова создал мысли, что у меня будет только 1 экземпляр (в моем проекте), но я ошибся. Если изначально был установлен codegen: ClassDefinition
, то Xcode будет продолжать создавать классы auto-generated
classes + extensions и помещать их в скрытую папку ../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 поместит файлы в скрытый каталог, но он будет доступен для использования в вашем проекте. Моя говядина с этим - это автоматически созданные файлы, не контролируемые источником, и если я сменил компьютер, который я должен знать, чтобы автоматически генерировать их на новой станции.
Надеюсь, это поможет кому-то еще!
Ура!
Ответ 3
Это действительно не ошибка. Поскольку @Morrowless предлагает создание и определение класса, и расширение свойств. Если это не требуется, выберите Ручной/Нет в Codegen до, генерируя код. Если код уже сгенерирован, просто удалите его и повторите попытку Editor->Create NSManagedObject Subclass...
из меню (после установки Manual/None).
Примечание. На приведенном ниже рисунке имя класса "Контакт" относится к моему проекту. Вместо этого вы увидите свое имя сущности.
![введите описание изображения здесь]()
Ответ 4
Если вы создали подклассы CoreData с codegen: ClassDefinition
, вы в основном завинчивались. Единственный способ исправить это:
- Удалите подклассы CoreData.
- Удалите папку с производными данными.
- Очистите проект (CMD + K).
- Создайте новые подклассы CoreData, на этот раз выберите
Codegen: Manual/None
и Module: Current Product Module
Ответ 5
Это не ошибка. Codegen создает эти файлы в папке DerivedData, поэтому вам не нужно создавать их снова в своем проекте, следовательно, ошибка компиляции.
Из Xcode 8.0 Примечания к выпуску:
Xcode автоматически генерирует классы или расширения классов для объектов и свойств в модели данных основных данных. Автоматическая генерация кода включена и отключена на основе сущности по сущности и включена для всех объектов в новых моделях, которые используют формат файла Xcode 8. Эта функция доступна для любой модели данных, которая была обновлена до формата Xcode 8. Вы указываете, генерирует ли Xcode код Swift или Objective-C для модели данных с помощью инспектора файлов моделей данных.
Когда автоматическая генерация кода включена для объекта, Xcode создает либо расширение класса или класса для объекта, как указано в инспектор объекта: используется указанное имя класса, а источники размещаются в проектах Derived Data. Для Swift и Objective-C, эти классы непосредственно используются из проектов код. Для Objective-C создается дополнительный файл заголовка для всех сгенерированных объектов в вашей модели. Имя файла заголовка соответствует именования "DataModelName + CoreDataModel.h".
Однако, если вы выбрали Category/Extension в раскрывающемся меню codegen в инспекторе модели данных (потому что вы хотите добавить логику к своей модели): codegen будет ошибочно генерировать оба класса определение и расширение свойств.
Решение состоит в том, чтобы просто удалить расширение свойств ( ClassName + CoreDataProperties.swift). Теперь ваш проект должен компилироваться.
Ответ 6
Следуя указаниям oyalhi и Vladimir Shutyuk (удаляя файлы NSManagedObject
, меняя сущность codegen
на Manual/None
), мне пришлось перезапустить Xcode, чтобы он мог индексироваться снова, прежде чем я мог бы повторно генерировать файлы NSManagedObject
и получить успешную компиляцию.