Перейти к содержимому

Кэш Rust

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

Экспериментальный кэш компиляции

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

Включить кэширование#

Следуйте настройке проекта Rust, чтобы подключить проект и пройти аутентификацию. Затем запустите сборку через Tuist:

bash
tuist cargo build --release

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

Если вы используете mise, настройте обертку Cargo, чтобы продолжать вводить обычные команды cargo.

Как это работает#

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

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

Локальные сборки и сборки в CI используют один и тот же протокол удаленного кэша. Доступ на чтение и запись обеспечивается учетными данными кэша, выданными сервером Tuist, и политикой загрузки в кэш вашего аккаунта. Аккаунт может разрешить разработчикам скачивать данные, ограничивая загрузку только для CI и токенов аккаунта. Writers кэша — это доверенные создатели кода: кэшированные результаты компилятора являются исполняемым кодом, поэтому предоставляйте доступ на запись только тем машинам и токенам, которым вы доверяете.

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

Что можно кэшировать#

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

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

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

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

Существующая глобальная обертка компилятора отключает кэш компиляции Tuist и наблюдатель компилятора. Пользовательские обертки рабочего пространства также обходят кэширование. См. совместимость инструментов компилятора.

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

Проверить повторное использование#

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

bash
tuist cargo build --release
cargo clean
tuist cargo build --release

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

Просмотр активности кэша#

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

Отсутствующие измерения не считаются нулевыми, а попадание в кэш не обязательно означает удаленную загрузку. Подробнее см. измерения кэша Rust.

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

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

bash
TUIST_DEBUG=1 tuist cargo build --release

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