Что находится внутри папки «DerivedData»?

Удаление DerivedData — хорошо известный трюк, который пригодится каждый раз, когда Xcode ведет себя странно без видимой причины. Я до сих пор хорошо помню, как мой старший в первый раз рассказал мне об этом базовом трюке iOS-разработчика.

Шли годы и накапливался опыт, и я начал понимать, какие ошибки можно исправить таким образом. Однако я так и не понял, что именно находится внутри папки DerivedData. Я решил изменить это, и вот мои выводы.

Примечание. Содержимое DerivedData зависит от версии Xcode. В этом посте я использовал Xcode 10.0 beta 6.

Я полностью удалил существующую папку DeriveData. Затем я создал пример проекта под названием DDExample из шаблона приложения с одним представлением и открыл его в Xcode.

Xcode немедленно создает новую папку DerivedData с двумя подпапками — одну с именем ModuleCache и одну с именем проекта, за которым следует какой-то хэш.

Module Cache

Как следует из названия, именно здесь Xcode хранит предварительно скомпилированные файлы модулей (.pcm). Модуль — это способ организации и совместного использования повторно используемого кода. Модули были введены в Clang (компилятор, используемый Xcode) несколько лет назад, в основном для обеспечения разумного и масштабируемого времени компиляции. Было обычным делом, что для каждого отдельного импорта в исходном файле компилятору приходилось включать и анализировать мегабайты дополнительных заголовков. Благодаря модулям заголовки анализируются и компилируются только один раз.

Там вы можете увидеть две подпапки с именами AIEKQT3S8ZS7 и 391J0EBN0O3XH. Количество этих папок и их имена, скорее всего, на вашем компьютере будут другими. Имя каждой подпапки относится к хэшу, вычисленному из аргументов, переданных компилятору. Чем больше уникальных конфигураций компилятора использует ваш проект, тем больше подпапок с файлами .pcm находится в этой папке. Каждая вложенная папка содержит один и тот же набор файлов .pcm, предварительно скомпилированных с заданными аргументами.

Дополнительная информация об этом процессе: За кулисами процесса сборки Xcode.

Стоит прямо упомянуть, что папка ModuleCache не зависит от проекта и является общей для всех ваших проектов.

Index

Здесь Xcode хранит данные, собранные на этапе индексации. Эти данные используются для поиска, быстрой навигации и рефакторинга внутри проекта. До Xcode 9 данные хранились с использованием SQLite в удобочитаемой форме.

В Xcode 9 Apple изменила способ хранения данных индекса и теперь использует LMDB.

Это не имеет большого значения, потому что вы все еще можете открывать и проверять файлы mdb. Однако вместо человекочитаемых ключей Apple использует какие-то хэши. Однако Apple использует двоичные ключи, и они не читаются человеком.

Я использовал FastoNoSQL, чтобы открыть файл mdb.

Я не могу рассказать вам больше о том, как работает текущий формат, потому что я не смог найти никакой дополнительной информации по этому вопросу. Не стесняйтесь оставлять комментарии ниже или пинговать меня в Твиттере, если у вас есть дополнительная информация.

Logs

Внутри этой папки Xcode хранит всевозможные журналы, разделенные по доменам (Install, Build и т. д.). Помните, что я еще не построил проект, поэтому папка журналов сборки пуста. Посмотрите, что происходит, когда я создаю проект:

Дополнительные сведения о журналах тестирования в Xcode.

TextIndex

Я понятия не имею, для чего эта папка. Мне не удалось найти ни одной информации, в которой упоминалась бы эта папка или файл. Если вы можете помочь пролить свет на это, пожалуйста, прокомментируйте ниже или напишите мне в Твиттере.

Build/Products

Вероятно, самая важная папка внутри DerivedData! Здесь собран ваш окончательный файл .app (папка). Это фактический файл, который копируется и устанавливается в симулятор (или на устройство iOS).

Вы можете видеть, что я создал приложение в конфигурации отладки, ориентированной на симулятор iOS. Когда я создаю его для реального устройства, создается подпапка Debug-iphoneos.

Build/Intermediates.noindex

И, наконец, последняя папка, о которой я хотел бы упомянуть: Intermediates. Это место, где система сборки Xcode записывает вспомогательные файлы, необходимые для сборки приложения. Эти файлы также кэшируются здесь и повторно используются позже. Система сборки достаточно умна, чтобы не перекомпилировать файлы, которые не были изменены.

Посмотрите, что происходит, когда я что-то меняю в AppDelegate.swift и снова собираю. Вы можете видеть, что были обновлены только вспомогательные файлы AppDelegate.