Skip to content

Кэширование задач

Vite Task может автоматически отслеживать зависимости и кэшировать задачи, запускаемые через vp run.

Обзор

Когда задача успешно завершается (код выхода 0), её вывод в терминал (stdout/stderr) сохраняется. При следующем запуске Vite Task проверяет, изменилось ли что-либо из следующего:

  1. Аргументы: изменились ли дополнительные аргументы, переданные задаче?
  2. Переменные окружения: изменились ли какие-либо отслеживаемые переменные окружения?
  3. Входные файлы: изменился ли какой-либо файл, который читает команда?

Если всё совпадает, кэшированный вывод мгновенно воспроизводится, а сама команда не запускается.

ИНФОРМАЦИЯ

По умолчанию кэшируется и воспроизводится только вывод терминала. Чтобы кэшировать файлы, создаваемые задачей, настройте шаблоны output. Соответствующие файлы архивируются после успешного выполнения задачи и восстанавливаются при попадании в кэш.

vite.config.ts
ts
tasks: {
  build: {
    command: 'vp build',
    output: ['dist/**'],
  },
}

Когда происходит промах кэша, Vite Task точно сообщает причину:

$ vp lint ✗ cache miss: 'src/utils.ts' modified, executing
$ vp build ✗ cache miss: env changed, executing
$ vp test ✗ cache miss: args changed, executing

Когда включено кэширование?

Команда, запускаемая через vp run, может быть либо задачей, определённой в vite.config.ts, либо скриптом, определённым в package.json. Имена задач и скриптов не могут пересекаться. По умолчанию задачи кэшируются, а скрипты — нет.

Существует три уровня управления кэшированием задач в следующем порядке:

1. cache: false для отдельной задачи

Задача может установить cache: false, чтобы отказаться от кэширования. Это нельзя переопределить никакими другими флагами управления кэшем.

2. Флаги CLI

--no-cache отключает кэширование для всего. --cache включает кэширование как для задач, так и для скриптов, что эквивалентно установке run.cache: true для данного запуска.

3. Конфигурация рабочего пространства

Параметр run.cache в корневом vite.config.ts задаёт поведение по умолчанию для каждой категории:

ПараметрПо умолчаниюЭффект
cache.taskstrueКэшировать задачи, определённые в vite.config.ts
cache.scriptsfalseКэшировать скрипты из package.json

Автоматическое отслеживание файлов

Vite Task отслеживает, какие файлы читает каждая команда во время выполнения. Когда задача запускается, система фиксирует, какие файлы открывает процесс, например исходные файлы .ts, vite.config.ts и package.json, и сохраняет хеши их содержимого. При следующем запуске эти хеши проверяются повторно, чтобы определить, изменилось ли что-либо.

Это означает, что кэширование работает «из коробки» для большинства команд без какой-либо дополнительной настройки. Vite Task также отслеживает:

  • Отсутствующие файлы: если команда проверяет наличие файла, которого не существует, например utils.ts во время разрешения модулей, последующее создание этого файла корректно приводит к инвалидизации кэша.
  • Содержимое каталогов: если команда сканирует каталог, например когда тестовый раннер ищет файлы *.test.ts, добавление или удаление файлов в этом каталоге приводит к инвалидизации кэша.

Как избежать слишком широкого отслеживания входных данных

Автоматическое отслеживание иногда может включать больше файлов, чем необходимо, что приводит к лишним промахам кэша:

  • Файлы кэша инструментов: некоторые инструменты поддерживают собственный кэш, например .tsbuildinfo у TypeScript или каталог target/ у Cargo. Эти файлы могут изменяться между запусками даже без изменений в исходном коде, что приводит к ненужной инвалидизации кэша.
  • Содержимое каталогов: когда команда сканирует каталог, например используя шаблон **/*.js, Vite Task видит чтение каталога, но не сам шаблон поиска. В результате добавление или удаление любого файла в этом каталоге, даже не связанного с задачей, приводит к инвалидизации кэша.

Используйте параметр input, чтобы исключить файлы из отслеживания или заменить автоматическое отслеживание явными шаблонами файлов:

vite.config.ts
ts
tasks: {
  build: {
    command: 'tsc',
    input: [{ auto: true }, '!**/*.tsbuildinfo'],
  },
}

Переменные окружения

По умолчанию задачи запускаются в чистом окружении. Передаётся только небольшой набор распространённых переменных, таких как PATH, HOME и CI. Остальные переменные окружения недоступны задаче и не включаются в отпечаток кэша.

Чтобы добавить переменную окружения в ключ кэша, укажите её в параметре env. При изменении её значения кэш будет инвалидирован:

vite.config.ts
ts
tasks: {
  build: {
    command: 'webpack --mode production',
    env: ['NODE_ENV'],
  },
}

Чтобы передать переменную задаче без влияния на поведение кэша, используйте параметр untrackedEnv. Это полезно для таких переменных, как CI или GITHUB_ACTIONS, которые должны быть доступны задаче, но обычно не влияют на кэширование.

Подробную информацию о шаблонах с подстановочными знаками и полный список автоматически передаваемых переменных см. в разделе Конфигурация Run.

Совместное использование кэша

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

package.json
json
{
  "scripts": {
    "check": "vp lint && vp build",
    "release": "vp lint && deploy-script"
  }
}

При включённом кэшировании, например через --cache или run.cache.scripts: true, запуск check перед release означает, что шаг vp lint в release мгновенно получит попадание в кэш, поскольку в обоих случаях выполняется одна и та же команда над одними и теми же файлами.

Команды управления кэшем

Используйте vp cache clean, когда необходимо очистить кэшированные результаты задач:

bash
vp cache clean

Кэш задач хранится в каталоге node_modules/.vite/task-cache в корне проекта. Команда vp cache clean удаляет этот каталог кэша.