Перейти до вмісту

Завдання збирання

Як 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

Чи була ця сторінка корисною?