Одной из целей, которую я ставил перед собой, приступая к разработке Secrets 4, был рефакторинг кода на более мелкие модули. Это было сделано по двум причинам:
- В то время компилятор Swift действительно лучше справлялся с небольшими модулями, чем с большими и уникальными.
- Я хотел воспользоваться ключевыми словами управления доступом Swift (public, private, internal), чтобы четко определить границы модулей и символы, предназначенные только для внутреннего использования.
В структуре папок, использовавшейся до этого рефакторинга, уже было заложено некоторое представление о том, как будет выглядеть каждый модуль. Так что оставалось только создать несколько фреймворков, переместить файлы и исправить декларации импорта и ключевые слова управления доступом. Это был медленный, но неспешный процесс.
Сегодня в Secrets есть 36 отдельных фреймворков. Большинство из них (33) — это статические фреймворки, которые объединены в один динамический.
Постепенно время сборки Secrets становилось все медленнее и медленнее, и я не замечал этого… до бета-версии Xcode 16, когда я почувствовал, что мне действительно нужно понять, что происходит.
Сборка с Timing Summaries
Наконец-то я нашел время, чтобы разобраться в этом вопросе, и собрал проект с временной сводкой (в Xcode выберет Product > Perform Action > Build with Timing Summary). Причина такой медлительности сразу же стала ясна…
Компилятор явно тратит большую часть из тех 3.5 минут, которые потребовались для сборки Secrets, на проверку модулей…
Быстрый поиск в настройках сборки проекта показал, что для большинства новых модулей параметр ENABLE_MODULE_VERIFIER
установлен в YES
. Заглянув в документацию по Xcode, мы можем найти, что именно это включает.
В Xcode версии 14.3 или более поздней включите верификатор модулей в настройках сборки вашего проекта Xcode, чтобы вы могли выявить и устранить проблемы с модулем фреймворка перед его распространением. Некоторые примеры таких проблем:
- Отсутствие ссылок на заголовок в зонтичном заголовке
- Использование включений в кавычках вместо включений в угловых скобках
- Использование синтаксиса @import в публичных и приватных заголовках
- Неправильные условия таргета
- Немодульные заголовки в вашем зонтичном заголовке
- Ссылки на приватные заголовки из публичных заголовков
Когда вы включаете верификатор модулей, он находит проблемы с модулями в вашем коде и отображает ошибки для них в навигаторе Issue в Xcode, как и ошибки компилятора или предупреждения.
Все это звучит хорошо и здорово, особенно если вы распространяете фреймворк, но я явно не хочу делать это в Secrets в каждой сборке!
Поэтому я отключил его для отладочных сборок.
Этот твик сократил время сборки с 3.5 минут до 52 секунд 😮!
И мне потребовалось менее 30 минут, чтобы найти проблему и исправить ее… За последние два года я ждал окончания сборки гораздо дольше.
Заключение
Сборка с временной сводкой — ваш друг. Не забывайте периодически обращаться к ней, чтобы узнать, в чем дело.