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