Что находится внутри папки «Производные данные»?

5 сентября 2018 г.

(эта статья изначально была написана для моего блога vojtastavik.com)

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

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

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

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

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


Кэш модуля

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

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

Подробнее об этом процессе: За кулисами процесса сборки Xcode.

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


Индекс

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

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

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

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


Журналы

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

Подробнее о Журналы испытаний в Xcode.


ТекстИндекс

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


Сборка/Продукты

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

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


Сборка/Промежуточные.noindex

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

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


На написание этого поста в блоге ушло 14 часов, включая 8 часов исследований. (нижний колонтитул вдохновлен Мишель Титул)

Похожие записи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *