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

Задачи сборки

Как elide build выводит задачи из манифеста elide.pkl и выполняет их в порядке зависимостей: цели, параметры, кеш сборки, состояние сборки и замер времени.

На этой странице

elide build выводит задачи из наборов исходников и артефактов в elide.pkl и выполняет их в порядке зависимостей. Задачи с неизменившимися входными данными пропускаются или восстанавливаются из кеша.

Запуск сборки

elide build                   # run the default group
elide build compile-java-main # run one task
elide build compile           # run a group
elide build clean             # the clean target
elide build --inspect         # list tasks and their options without running

Аргумент задаёт задачу или группу; начальное двоеточие (:compile-java-main) необязательно. Цель, которой ничего не соответствует, приводит к ошибке сборки.

ГруппаПсевдонимЗадачи
default—То, что выполняет elide build без аргументов.
dependenciesdepsРазрешение и установка зависимостей.
compilationcompileКомпиляция исходников.
testingtestТесты; их также запускает elide test.

Некоторые задачи принимают параметры; их выводит --inspect:

elide build test --select=class:com.example.SomeTest
elide build run --args="a b c"

В рабочем пространстве добавьте префикс проекта: core:compile-kotlin-main, core:compile или core для его задач по умолчанию. Цели без префикса ищутся в текущем проекте, затем в корне. --inspect группирует задачи по проектам, а строки прогресса называют проект ([core] Compiling Kotlin sources).

Параметры

Параметры записываются как --name или --name=value в любом месте среди целей. Аргументы после -- передаются процессу, который запускает задача.

ПараметрДействие
--inspect, -iВывести задачи и их параметры без запуска.
--no-cacheИгнорировать кеш и локальное состояние сборки; выполняются все задачи.
--offlineБез загрузки зависимостей и без общего кеша.
--workers=NНе более N одновременных задач (по умолчанию — число процессоров). Знак = обязателен.
--insights=FILEЗапускать скрипт Insight в задачах, которые запускают программы; можно повторять.
-f NAME[=VALUE]Флаг сборки, читается как build.flags; см. Флаги сборки.

Параметры проверяются по задачам до начала выполнения. Неизвестный параметр, отсутствующее или лишнее значение либо повторённый параметр приводят к ошибке:

Unknown option '--worker', did you mean '--workers'?
Option '--workers' requires a value, as '--workers=<value>'

Глобальные флаги (-p, -v, --debug и другие) не проверяются. Параметры задач: Зависимости, Тестирование.

Кеш сборки

Локальный уровень включён всегда: ~/.elide/cache/entries-v2, по одному каталогу на ключ с записью и tar-архивом результатов. При восстановлении проверяется записанный отпечаток. Записи в старом формате считаются промахом.

Общий уровень — это HTTP-кеш, который настраивается переменными окружения:

ПеременнаяНазначение
ELIDE_REMOTE_CACHEURL конечной точки. Не задана — общего уровня нет.
ELIDE_REMOTE_CACHE_TOKENBearer-токен; имеет приоритет над базовой аутентификацией.
ELIDE_REMOTE_CACHE_USERNAME, ELIDE_REMOTE_CACHE_PASSWORDБазовая аутентификация; данные пользователя в URL тоже работают.
ELIDE_REMOTE_CACHE_PUSHВыгружать результаты этой сборки (по умолчанию true).
ELIDE_REMOTE_CACHE_PULLЗагружать при промахе (по умолчанию true).
ELIDE_REMOTE_CACHE_POLICYeager (по умолчанию) передаёт каждую запись; smart — только когда это экономит время.
  • Сначала проверяется локальный кеш; попадания в удалённом кеше сохраняются локально.
  • Типичная настройка: CI выгружает, разработчики задают ELIDE_REMOTE_CACHE_PUSH=false.
  • Недоступные, медленные или нечитаемые удалённые записи считаются промахами. Три сбоя транспорта подряд отключают уровень до конца сборки. Ошибки HTTP, например 404, сбоями транспорта не считаются; об отклонённых учётных данных выводится одно предупреждение.
  • Сборка завершается ошибкой при URL со схемой, отличной от http/https, пароле без имени пользователя, небулевом PUSH/PULL или учётных данных по незашифрованному http к хосту, отличному от loopback.
  • Кеш отдаёт исполняемые результаты: используйте https, требуйте аутентификацию для записи и ограничьте круг тех, кто может записывать.
  • --offline отключает общий уровень на один запуск; --no-cache отключает кеширование.

.eliderc и политика smart

При smart запись загружается, только если это дешевле повторной сборки, и выгружается, только если выгрузка обходится дешевле, чем работа, которую она экономит. Стоимость берётся из .eliderc (синтаксис java.util.Properties): ~/.eliderc, поверх него <project>/.eliderc. Файл описывает машину, поэтому не добавляйте его в репозиторий.

# ~/.eliderc
network.downlink = 200mbps
network.uplink = 20mbps
network.latency = 250ms
network.stability = good        # good | fair | poor
machine.compute = fast          # slow | normal | fast, or a multiplier such as 1.5

cache.remote.policy = smart     # smart | eager (default)
cache.remote.upload-budget = 2.0
cache.remote.min-build = 500ms  # work cheaper than this is never published

Mb/s и mbps — мегабиты; MB/s — мегабайты. Для нечитаемых значений выводится предупреждение и используется значение по умолчанию. ELIDE_REMOTE_CACHE_POLICY переопределяет cache.remote.policy. При eager файл ни на что не влияет.

Состояние сборки

ФайлРоль
.dev/elide.lock.v2.binПереносимые отпечатки задач, которые можно использовать на разных машинах. Это не lock-файл зависимостей.
.dev/elide.build.binОтпечатки задач, локальные для машины.
.dev/elide.filehash.binХеши файлов с ключом по размеру, времени, inode и режиму, чтобы не перечитывать неизменённые файлы.
  • Двоичные файлы; не редактируйте их.
  • Единого lock-файла зависимостей для всех экосистем нет; npm записывает aube-lock.yaml.
  • В рабочем пространстве состояние всех участников хранится в .dev/ корня; результаты остаются в .dev/ каждого проекта.
  • --no-cache игнорирует локальный файл состояния, но по-прежнему читает общий.
  • elide install повторно использует разрешение, пока список зависимостей не меняется; --fresh заново загружает все зависимости, обновляя глобальный кеш.
  • Аргументы каждого компилятора записываются рядом с его результатом в <tool>.args, по одному на строку.

Замер времени сборки

Каждая задача выводит свою длительность. Подробнее:

elide build -v                                                # everything, at debug
ELIDE_LOG=dev.elide.tooling.build.telemetry=debug elide build # only the timings
[debug] dev.elide.tooling.build.telemetry stage graph took 590us
[debug] dev.elide.tooling.build.telemetry op compile-kotlin-main · up-to-date (up-to-date) took 420us
[debug] dev.elide.tooling.build.telemetry task compile-kotlin-main (skipped: up-to-date) took 12.6ms

Участок — это этап (конфигурация, граф, выполнение, сохранение состояния), задача или операция над задачей (prepare, fingerprint, up-to-date, execute, поиск и запись в кеше). Работа внутри execute не детализируется.

ELIDE_BUILD_TELEMETRY по завершении сборки записывает локальную трассировку Chrome; ничего не выгружается:

ELIDE_BUILD_TELEMETRY=1 elide build             # .dev/telemetry/build-<stamp>.trace.json
ELIDE_BUILD_TELEMETRY=profile.json elide build  # a file you name
ELIDE_BUILD_TELEMETRY=/tmp/traces elide build   # a directory you name

Откройте её в Perfetto, chrome://tracing или speedscope либо выполните:

jq -r '.traceEvents[] | select(.ph=="X") | "\(.dur/1000 | floor)ms \(.cat) \(.name)"' \
  .dev/telemetry/build-*.trace.json | sort -rn | head

Была ли эта страница полезной?