# Хеширование {#hashing}

Такие функции, как
<LocalizedLink href="/guides/features/cache">кэширование</LocalizedLink> или
выборочное выполнение тестов, требуют способа определить, изменилась ли цель.
Tuist вычисляет хэш для каждой цели в графе зависимостей, чтобы определить,
изменилась ли цель. Хэш вычисляется на основе следующих атрибутов:

- Атрибуты цели (например, название, платформа, продукт и т. д.)
- Файлы цели
- Хэш зависимостей цели

### Атрибуты кэша {#cache-attributes}

Кроме того, при вычислении хэша для
<LocalizedLink href="/guides/features/cache">caching</LocalizedLink> мы также
хэшируем следующие атрибуты.

#### Версия Swift {#swift-version}

Мы хэшируем версию Swift, полученную в результате выполнения команды
`/usr/bin/xcrun swift --version`, чтобы избежать ошибок компиляции из-за
несовпадения версий Swift в целевых и двоичных файлах.

> [!NOTE]
> **Module Stability**
>
> Предыдущие версии кэширования бинарных файлов полагались на настройку сборки
> `BUILD_LIBRARY_FOR_DISTRIBUTION`, чтобы включить [стабильность
> модулей](https://www.swift.org/blog/library-evolution#enabling-library-evolution-support)
> и позволить использовать бинарные файлы с любой версией компилятора. Однако это
> вызывало проблемы с компиляцией в проектах с целями, не поддерживающими
> стабильность модулей. Генерируемые двоичные файлы привязываются к версии Swift,
> используемой для их компиляции, и эта версия должна совпадать с версией Swift,
> используемой для компиляции проекта.


#### Конфигурация {#configuration}

Идея флага `-configuration` заключалась в том, чтобы исключить использование
отладочных бинарников в сборках релизов и наоборот. Однако нам все еще не
хватает механизма для удаления других конфигураций из проектов, чтобы
предотвратить их использование.

## Отладка {#debugging}

Если вы заметили недетерминированное поведение при использовании кэширования в
разных окружениях или вызовах, это может быть связано с различиями между
окружениями или ошибкой в логике хэширования. Мы рекомендуем выполнить следующие
шаги для отладки проблемы:

1. Выполните команду `tuist hash cache` или `tuist hash selective-testing` (хэши
   для <LocalizedLink href="/guides/features/cache">двоичного кэширования</LocalizedLink> или
   <LocalizedLink href="/guides/features/selective-testing">селективного тестирования</LocalizedLink>), скопируйте хэши, переименуйте каталог проекта
   и выполните команду снова. Хэши должны совпасть.
2. Если хэши не совпадают, скорее всего, сгенерированный проект зависит от
   окружения. Запустите `tuist graph --format json` в обоих случаях и сравните
   графики. В качестве альтернативы сгенерируйте проекты и сравните их файлы
   `project.pbxproj` с помощью инструмента сравнения, например
   [Diffchecker](https://www.diffchecker.com).
3. Если хэши одинаковы, но отличаются в разных окружениях (например, в CI и
   локальном), убедитесь, что везде используются одинаковые
   [configuration](#configuration) и [Swift version](#swift-version). Версия
   Swift привязана к версии Xcode, поэтому убедитесь, что версии Xcode
   совпадают.

Если хэши по-прежнему не детерминированы, сообщите нам, и мы поможем с отладкой.


> [!NOTE]
> **Планируется Улучшить Эксперимент Отладки**
>
> Улучшение опыта отладки входит в нашу дорожную карту. Команда print-hashes,
> которой не хватает контекста для понимания различий, будет заменена более
> удобной командой, которая использует древовидную структуру для отображения
> различий между хэшами.

