Aller au contenu

Tâches de build

Comment elide build déduit des tâches d'un manifeste elide.pkl et les exécute dans l'ordre des dépendances : cibles, options, cache de build, état du build et mesure des temps.

Sur cette page

elide build déduit des tâches des source sets et des artefacts de elide.pkl et les exécute dans l’ordre des dépendances. Les tâches dont les entrées n’ont pas changé sont ignorées ou restaurées depuis le cache.

Lancer un build

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

Un argument nomme une tâche ou un groupe ; le deux-points initial (:compile-java-main) est facultatif. Une cible qui ne correspond à rien fait échouer le build.

GroupeAliasTâches
default—Ce qu’exécute un simple elide build.
dependenciesdepsRésolution et installation des dépendances.
compilationcompileCompilation des sources.
testingtestTests ; également lancés par elide test.

Certaines tâches acceptent des options, listées par --inspect :

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

Dans un espace de travail, préfixez le projet : core:compile-kotlin-main, core:compile, ou core pour ses tâches par défaut. Les cibles sans préfixe se résolvent dans le projet courant, puis dans la racine. --inspect regroupe les tâches par projet, et les lignes de progression le nomment ([core] Compiling Kotlin sources).

Options

Les options s’écrivent --name ou --name=value, n’importe où parmi les cibles. Les arguments après -- vont au processus que lance une tâche.

OptionEffet
--inspect, -iListe les tâches et leurs options sans les exécuter.
--no-cacheIgnore le cache et l’état local du build ; toutes les tâches s’exécutent.
--offlineAucun téléchargement de dépendances et aucun cache partagé.
--workers=NAu plus N tâches simultanées (par défaut : nombre de processeurs). Le = est obligatoire.
--insights=FILEExécute un script Insight dans les tâches qui lancent des programmes ; répétable.
-f NAME[=VALUE]Option de build, lue via build.flags ; voir Options de build.

Les options sont vérifiées par rapport aux tâches avant toute exécution. Une option inconnue, une valeur manquante ou inattendue, ou une option répétée provoque un échec :

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

Les options globales (-p, -v, --debug et les autres) sont exemptées. Options des tâches : Dépendances, Tests.

Cache de build

Le niveau local est toujours actif : ~/.elide/cache/entries-v2, un répertoire par clé avec un enregistrement et une archive tar des sorties. Les restaurations sont vérifiées par rapport à l’empreinte enregistrée. Les entrées dans un format plus ancien comptent comme absentes.

Le niveau partagé est un cache HTTP, configuré par des variables d’environnement :

VariableSignification
ELIDE_REMOTE_CACHEURL du point de terminaison. Non définie : pas de niveau partagé.
ELIDE_REMOTE_CACHE_TOKENJeton bearer ; prioritaire sur l’authentification basique.
ELIDE_REMOTE_CACHE_USERNAME, ELIDE_REMOTE_CACHE_PASSWORDAuthentification basique ; les informations utilisateur dans l’URL fonctionnent aussi.
ELIDE_REMOTE_CACHE_PUSHEnvoie les sorties de ce build (true par défaut).
ELIDE_REMOTE_CACHE_PULLTélécharge les entrées absentes (true par défaut).
ELIDE_REMOTE_CACHE_POLICYeager (par défaut) transfère chaque entrée ; smart ne transfère que si cela fait gagner du temps.
  • Le cache local est consulté en premier ; les entrées trouvées à distance sont stockées localement.
  • Configuration type : la CI envoie ; les développeurs définissent ELIDE_REMOTE_CACHE_PUSH=false.
  • Les entrées distantes injoignables, lentes ou illisibles comptent comme absentes. Trois échecs de transport consécutifs désactivent le niveau pour le reste du build. Les erreurs HTTP comme 404 ne sont pas des échecs de transport ; un identifiant refusé déclenche un seul avertissement.
  • Le build échoue sur une URL autre que http/https, un mot de passe sans nom d’utilisateur, un PUSH/PULL non booléen, ou des identifiants envoyés en http non chiffré vers un hôte autre que le loopback.
  • Le cache fournit des sorties exécutables : utilisez https, exigez une authentification pour les écritures et limitez qui peut écrire.
  • --offline désactive le niveau partagé pour une exécution ; --no-cache désactive le cache.

.eliderc et la politique smart

Avec smart, une entrée n’est téléchargée que si c’est moins coûteux que de reconstruire, et envoyée que si l’envoi coûte moins que le travail qu’il épargne. Les coûts viennent de .eliderc (syntaxe java.util.Properties) : ~/.eliderc, puis <project>/.eliderc par-dessus. Ce fichier décrit la machine : ne le commitez pas.

# ~/.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 et mbps sont des mégabits ; MB/s des mégaoctets. Les valeurs illisibles déclenchent un avertissement et la valeur par défaut s’applique. ELIDE_REMOTE_CACHE_POLICY prime sur cache.remote.policy. Avec eager, le fichier n’a aucun effet.

État du build

FichierRôle
.dev/elide.lock.v2.binEmpreintes portables par tâche, partageables entre machines. Ce n’est pas un fichier de verrouillage des dépendances.
.dev/elide.build.binEmpreintes par tâche, propres à la machine.
.dev/elide.filehash.binCondensats de fichiers indexés par taille, dates, inode et mode, pour ne pas relire les fichiers inchangés.
  • Fichiers binaires ; ne les modifiez pas.
  • Il n’existe pas de fichier de verrouillage des dépendances pour tous les écosystèmes ; npm écrit aube-lock.yaml.
  • Dans un espace de travail, l’état de tous les membres est stocké dans le .dev/ de la racine ; les sorties restent dans le .dev/ de chaque projet.
  • --no-cache ignore le fichier d’état local, mais lit toujours celui qui est partagé.
  • elide install réutilise la résolution tant que la liste des dépendances ne change pas ; --fresh télécharge à nouveau toutes les dépendances et rafraîchit le cache global.
  • Les arguments de chaque compilateur sont écrits à côté de sa sortie dans <tool>.args, un par ligne.

Mesurer la durée d’un build

Chaque tâche affiche sa durée. Pour plus de détails :

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

Les régions sont une étape (configuration, graphe, exécution, sauvegarde de l’état), une tâche, ou une opération sur une tâche (prepare, fingerprint, up-to-date, execute, consultations et écritures du cache). Le travail à l’intérieur de execute n’est pas détaillé.

ELIDE_BUILD_TELEMETRY écrit une trace Chrome locale à la fin du build ; rien n’est envoyé :

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

Ouvrez-la dans Perfetto, chrome://tracing ou speedscope, ou :

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

Cette page vous a-t-elle aidé ?