Кэш Rust
Tuist кэширует поддерживаемые результаты компиляции Rust, чтобы Cargo мог повторно использовать их после удаления результатов сборки. Кэш встроен в CLI Tuist. Отдельный исполняемый файл кэша или плагин Cargo устанавливать не нужно.
Кэш является экспериментальным и прошел квалификацию на Mac с процессорами Apple silicon. Библиотеки кэшируются по исходным файлам, которые читает компилятор, на всех платформах, но кэширование библиотек в Linux еще не прошло квалификацию. Скрипты сборки, процедурные макросы, исполняемые файлы и нативный код кэшируются только на Mac с процессорами Apple silicon. Ключи кэша заменяют пути репозитория и тулчейна заполнителями, поэтому повторное использование работает для репозиториев в разных путях на одной машине, но не между машинами.
Включить кэширование#
Следуйте настройке проекта Rust, чтобы подключить проект и пройти аутентификацию. Затем запустите сборку через Tuist:
tuist cargo build --release
Кэширование выполняется автоматически для подходящих компиляций. Дополнительной настройки кэша или флага включения не требуется. Tuist обнаруживает конечную точку кэша вашего аккаунта и получает учетные данные кэша, используя существующую конфигурацию проекта и сервера.
Если вы используете mise, настройте обертку Cargo, чтобы продолжать вводить обычные команды cargo.
Как это работает#
Перед запуском Cargo Tuist восстанавливает результаты ваших зависимостей из реестра и git, которые предыдущая сборка создала с тем же тулчейном, профилем и конфигурацией, чтобы Cargo считал их актуальными. Cargo по-прежнему решает, что нужно пересобрать. Затем для каждой подходящей компиляции, которую все еще выполняет Cargo, Tuist:
- Проверяет локальный кэш на наличие совпадающих результатов.
- При локальном промахе кэша запрашивает Kura через API удаленного выполнения (REAPI), загружает недостающий контент и проверяет результаты перед их восстановлением.
- При промахе кэша обычно запускает компилятор. После успешной компиляции сохраняет результаты локально и загружает их в 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, затем повторите ту же сборку:
tuist cargo build --release
cargo clean
tuist cargo build --release
Подходящие библиотеки могут быть восстановлены при второй сборке; неподдерживаемые крейты все равно компилируются. Удаление результатов Cargo не удаляет отдельный локальный кэш Tuist. Это проверяет повторное использование, а не обязательно удаленные загрузки: локальное попадание в кэш не требует передачи данных из Kura. Валидация ввода и операции кэша добавляют накладные расходы, поэтому избегание компиляции не гарантирует более быстрых сборок для небольших крейтов.
Просмотр активности кэша#
Откройте Cargo Cache в панели управления вашего проекта, чтобы просмотреть процент попаданий, записанные передачи, задержку, пропускную способность и недавние сборки. Откройте вкладку Cache сборки для просмотра решений отдельных задач и выходов CAS.
Отсутствующие измерения не считаются нулевыми, а попадание в кэш не обязательно означает удаленную загрузку. Подробнее см. измерения кэша Rust.
Устранение неполадок#
Включите вывод отладки, чтобы проверить сбои передачи кэша и отчетности:
TUIST_DEBUG=1 tuist cargo build --release
Вывод отладки также объясняет, почему компиляция или запуск скрипта сборки не были сохранены. Если вы не видите попаданий, проверьте, что другая обертка компилятора не имеет приоритета, и что компилятор, флаги и среда соответствуют сборке, которая заполнила кэш. Для удаленных загрузок также проверьте аутентификацию и политику загрузки в кэш аккаунта.