Хеширование
Такие возможности, как кэширование или выборочное тестирование, требуют способа определить, изменилась ли цель. Tuist вычисляет хеш для каждой цели в графе зависимостей, чтобы понять, была ли она изменена. Хеш рассчитывается на основе следующих атрибутов:
- Атрибуты цели (например, имя, платформа, продукт и т. д.)
- Файлы цели
- Хеш зависимостей цели
Атрибуты кэша#
Кроме того, при вычислении хеша для кэширования мы также хешируем следующие атрибуты.
Версия Swift#
Мы хешируем версию Swift, полученную при выполнении команды /usr/bin/xcrun swift --version, чтобы предотвратить ошибки компиляции из-за несоответствия версий Swift между целями и бинарными файлами.
Предыдущие версии бинарного кэширования полагались на настройку сборки BUILD_LIBRARY_FOR_DISTRIBUTION, чтобы включить стабильность модулей и позволить использовать бинарные файлы с любой версией компилятора. Однако это вызывало проблемы компиляции в проектах с целями, которые не поддерживают стабильность модулей. Сгенерированные бинарные файлы привязаны к версии Swift, использованной для их компиляции, и версия Swift должна совпадать с той, которая использовалась для компиляции проекта.
Конфигурация#
При вычислении хешей кэша Tuist ограничивает настройки каждого проекта и цели разрешённой конфигурацией сборки. Это та, которая указана с помощью --configuration, иначе используется defaultConfiguration проекта, иначе первая отладочная конфигурация. Tuist хеширует имя этой конфигурации, вариант, настройки сборки и содержимое файла конфигурации вместе с общими базовыми настройками, которые к ней применяются. Добавление, удаление или изменение другой конфигурации не влияет на хеши кэша разрешённой конфигурации. Поскольку важна только разрешённая конфигурация, кэш, заполненный с явным указанием --configuration, может быть прочитан командой, которая разрешает ту же конфигурацию без передачи флага.
Отладка#
Если вы заметили недетерминированное поведение при использовании кэширования в разных средах или при разных вызовах, это может быть связано с различиями между средами или ошибкой в логике хеширования. Мы рекомендуем выполнить следующие шаги для отладки проблемы:
- Выполните
tuist hash cacheилиtuist hash selective-testing(хеши для бинарного кэширования или выборочного тестирования), скопируйте хеши, переименуйте каталог проекта и снова выполните команду. Хеши должны совпасть. - Если хеши не совпадают, вероятно, сгенерированный проект зависит от среды. Выполните
tuist graph --format jsonв обоих случаях и сравните графы. В качестве альтернативы сгенерируйте проекты и сравните их файлыproject.pbxprojс помощью инструмента diff, такого как Diffchecker. - Если хеши одинаковы, но различаются в разных средах (например, CI и локальной), убедитесь, что везде используется одна и та же конфигурация и одна и та же версия Swift. Версия Swift привязана к версии Xcode, поэтому убедитесь, что версии Xcode совпадают.
Если хеши по-прежнему недетерминированы, сообщите нам об этом, и мы поможем с отладкой.
Улучшение нашего опыта отладки находится в нашем плане развития. Команда print-hashes, которой не хватает контекста для понимания различий, будет заменена более удобной командой, которая использует древовидную структуру для отображения различий между хешами.