# Кэш Rust {#rust-cache}

Tuist кэширует поддерживаемые результаты компиляции Rust, чтобы Cargo мог повторно использовать их после удаления результатов сборки. Кэш встроен в CLI Tuist. Отдельный исполняемый файл кэша или плагин Cargo устанавливать не нужно.

> [!WARNING]
> **Экспериментальный кэш компиляции**
>
> Кэш является экспериментальным и прошел квалификацию на Mac с процессорами Apple silicon. Библиотеки кэшируются по исходным файлам, которые читает компилятор, на всех платформах, но кэширование библиотек в Linux еще не прошло квалификацию. Скрипты сборки, процедурные макросы, исполняемые файлы и нативный код кэшируются только на Mac с процессорами Apple silicon. Ключи кэша заменяют пути репозитория и тулчейна заполнителями, поэтому повторное использование работает для репозиториев в разных путях на одной машине, но не между машинами.


## Включить кэширование {#enable-caching}

Следуйте <.localized_link href="/guides/get-started/rust-project">настройке проекта Rust</.localized_link>, чтобы подключить проект и пройти аутентификацию. Затем запустите сборку через Tuist:

```sh
tuist cargo build --release
```

Кэширование выполняется автоматически для подходящих компиляций. Дополнительной настройки кэша или флага включения не требуется. Tuist обнаруживает конечную точку кэша вашего аккаунта и получает учетные данные кэша, используя существующую конфигурацию проекта и сервера.

Если вы используете mise, <.localized_link href="/guides/get-started/rust-project#keep-typing-cargo">настройте обертку Cargo</.localized_link>, чтобы продолжать вводить обычные команды `cargo`.

## Как это работает {#how-it-works}

Перед запуском Cargo Tuist восстанавливает результаты ваших зависимостей из реестра и git, которые предыдущая сборка создала с тем же тулчейном, профилем и конфигурацией, чтобы Cargo считал их актуальными. Cargo по-прежнему решает, что нужно пересобрать. Затем для каждой подходящей компиляции, которую все еще выполняет Cargo, Tuist:

1. Проверяет локальный кэш на наличие совпадающих результатов.
2. При локальном промахе кэша запрашивает Kura через API удаленного выполнения (REAPI), загружает недостающий контент и проверяет результаты перед их восстановлением.
3. При промахе кэша обычно запускает компилятор. После успешной компиляции сохраняет результаты локально и загружает их в Kura через REAPI при наличии авторизации. Запись в удаленном кэше публикуется только после того, как весь ссылочный контент станет доступен.

Локальные сборки и сборки в CI используют один и тот же протокол удаленного кэша. Доступ на чтение и запись обеспечивается учетными данными кэша, выданными сервером Tuist, и <.localized_link href="/guides/features/cache#restrict-uploads-to-ci">политикой загрузки в кэш</.localized_link> вашего аккаунта. Аккаунт может разрешить разработчикам скачивать данные, ограничивая загрузку только для CI и токенов аккаунта. Writers кэша — это доверенные создатели кода: кэшированные результаты компилятора являются исполняемым кодом, поэтому предоставляйте доступ на запись только тем машинам и токенам, которым вы доверяете.

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

## Что можно кэшировать {#what-can-be-cached}

Кэш поддерживает:

- Библиотечные крейты, включая крейты рабочего пространства и пути, крейты с зависимостями и крейты с генерируемыми источниками. Tuist формирует ключи на основе источников, прочитанных компилятором.
- На Mac с Apple Silicon — компиляции, которые инспекция источников не может заранее ключировать, например крейты, использующие процедурные макросы, встроенный ассемблер или нативные библиотеки, сами процедурные макросы и связанные исполняемые файлы. Tuist записывает файлы, переменные окружения и команды только для чтения, которые читает каждый из них, например `git describe`, и формирует ключи на их основе.
- На Mac с Apple Silicon — запуски скриптов сборки, включая компиляции C, которые они выполняют с помощью компилятора Apple по умолчанию. Запуск восстанавливается только тогда, когда файлы, окружение и команды, которые он читал, не изменились.
- Предупреждения и другие диагностические сообщения, которые кэшированный крейт показывает снова.

Следующее по-прежнему собирается обычным образом:

- Скрипты сборки и записанные компиляции на Linux.
- Скрипты сборки, которые подключаются к сети, запускают программы, которые Tuist не может наблюдать, или записывают данные вне своего выходного каталога.
- Инкрементальные компиляции, пользовательские цели и неподдерживаемые аргументы компилятора или входные источники.
- Вызовы `cargo check` только для метаданных.
- Компиляции, которые выдают неожиданный вывод компилятора.

Существующая глобальная обертка компилятора отключает кэш компиляции Tuist и наблюдатель компилятора. Пользовательские обертки рабочего пространства также обходят кэширование. См. <.localized_link href="/guides/features/build-insights/rust#other-compiler-tools">совместимость инструментов компилятора</.localized_link>.

Ключи кэша включают содержимое пакета, компилятор и тулчейн, аргументы и среду сборки. Расположения checkout, целевого каталога, домашней директории Cargo и тулчейна заменяются заполнителями, поэтому checkout по другому пути повторно использует те же записи. Крейт, чей результат встраивает свой собственный путь, например через `env!("CARGO_MANIFEST_DIR")`, повторно используется только по этому пути. Учетные данные, настройки отчетности Tuist и распознаваемые метаданные запуска CI не делают записи недействительными. Крейты, которые читают эти исключенные переменные во время компиляции, не кэшируются.

## Проверить повторное использование {#verify-reuse}

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

```sh
tuist cargo build --release
cargo clean
tuist cargo build --release
```

Подходящие библиотеки могут быть восстановлены при второй сборке; неподдерживаемые крейты все равно компилируются. Удаление результатов Cargo не удаляет отдельный локальный кэш Tuist. Это проверяет повторное использование, а не обязательно удаленные загрузки: локальное попадание в кэш не требует передачи данных из Kura. Валидация ввода и операции кэша добавляют накладные расходы, поэтому избегание компиляции не гарантирует более быстрых сборок для небольших крейтов.

## Просмотр активности кэша {#inspect-cache-activity}

Откройте **Cargo Cache** в панели управления вашего проекта, чтобы просмотреть процент попаданий, записанные передачи, задержку, пропускную способность и недавние сборки. Откройте вкладку **Cache** сборки для просмотра решений отдельных задач и выходов CAS.

Отсутствующие измерения не считаются нулевыми, а попадание в кэш не обязательно означает удаленную загрузку. Подробнее см. <.localized_link href="/guides/features/build-insights/rust#cache-measurements">измерения кэша Rust</.localized_link>.

## Устранение неполадок {#troubleshooting}

Включите вывод отладки, чтобы проверить сбои передачи кэша и отчетности:

```sh
TUIST_DEBUG=1 tuist cargo build --release
```

Вывод отладки также объясняет, почему компиляция или запуск скрипта сборки не были сохранены. Если вы не видите попаданий, проверьте, что другая обертка компилятора не имеет приоритета, и что компилятор, флаги и среда соответствуют сборке, которая заполнила кэш. Для удаленных загрузок также проверьте аутентификацию и политику загрузки в кэш аккаунта.
