Что находится внутри папки «Производные данные»?
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 часов исследований. (нижний колонтитул вдохновлен Мишель Титул)