Vai al contenuto principale
Traduzione Beta Non Ufficiale

Questa pagina è stata tradotta da PageTurner AI (beta). Non ufficialmente approvata dal progetto. Hai trovato un errore? Segnala problema →

Come Funziona la Cache

Prima di eseguire qualsiasi attività, Lerna calcola il suo hash computazionale. Finché l'hash computazionale rimane identico, il risultato dell'esecuzione del task sarà lo stesso.

Per impostazione predefinita, l'hash computazionale per un comando come lerna run test --scope=remixapp include:

  • Tutti i file sorgente di remixapp e delle sue dipendenze

  • Configurazioni globali rilevanti

  • Versioni delle dipendenze esterne

  • Valori runtime forniti dall'utente come la versione di Node

  • Flag dei comandi CLI

hashing-computazionale

Questo comportamento è personalizzabile. Ad esempio, i controlli di lint potrebbero dipendere solo dal codice sorgente del progetto e dalle configurazioni globali. Le build possono basarsi sui file dts delle librerie compilate invece che sui loro sorgenti.

Dopo aver calcolato l'hash per un'attività, Lerna verifica se ha già eseguito questa esatta computazione. Prima controlla localmente, poi se non la trova e se è configurata una cache remota, controlla in remoto.

Se Lerna trova la computazione, la recupera e la riproduce. Posiziona i file corretti nelle cartelle giuste e stampa l'output del terminale. Dal punto di vista dell'utente, il comando è stato eseguito allo stesso modo, ma molto più velocemente.

cache

Se Lerna non trova un hash computazionale corrispondente, esegue l'attività e al completamento acquisisce gli output e i log del terminale, memorizzandoli localmente (e se configurato, anche in remoto). Tutto ciò avviene in modo trasparente, senza necessità di intervento.

Sebbene concettualmente semplice, Lerna ottimizza questo processo per garantire un'esperienza fluida. Ad esempio:

  • Acquisisce stdout e stderr per garantire che l'output riprodotto sia identico, anche su Windows

  • Minimizza l'I/O ricordando quali file vengono riprodotti e dove

  • Mostra solo l'output rilevante durante l'elaborazione di grafi di attività complessi

  • Fornisce strumenti per diagnosticare i mancati riscontri in cache, oltre a molte altre ottimizzazioni

Man mano che il tuo workspace cresce, il grafo delle attività assume questa forma:

cache

Queste ottimizzazioni sono cruciali per rendere Lerna utilizzabile in workspace complessi. Viene eseguita solo la quantità minima di lavoro necessaria, mentre il resto viene lasciato invariato o ripristinato dalla cache.

Input per l'Hashing del Codice Sorgente

Il risultato della build o dei test di un'applicazione o libreria dipende dal codice sorgente del progetto e da tutte le librerie da cui dipende (direttamente o indirettamente).

Per impostazione predefinita, Lerna adotta un approccio conservativo. Quando esegui ad esempio lerna run test --scope=remixapp, considera tutti i file nella directory remixapp e nelle directory header e footer (dipendenze di remixapp). Ciò causerebbe mancati riscontri in cache non necessari. Ad esempio, modificare un file di specifiche in footer non influenzerebbe il risultato del test.

Possiamo definire una configurazione più precisa come segue:

NOTA: "{projectRoot}" e "{workspaceRoot}" sono sintassi speciali supportate dal task-runner, che verranno interpolate internamente durante l'esecuzione del comando. Non sostituire "{projectRoot}" o "{workspaceRoot}" con percorsi fissi poiché ciò riduce la flessibilità della configurazione.

nx.json
{
"namedInputs": {
"default": ["{projectRoot}/**/*"],
"prod": ["!{projectRoot}/**/*.spec.tsx"]
},
"targetDefaults": {
"build": {
"inputs": ["prod", "^prod"]
},
"test": {
"inputs": ["default", "^prod", "{workspaceRoot}/jest.config.ts"]
}
}
}

Con questa configurazione, lo script di build considererà solo i file non di test di remixapp, header e footer. Lo script di test considererà tutti i file sorgente del progetto in test e solo i file non di test delle sue dipendenze. Lo script di test considererà inoltre il file di configurazione jest alla root della workspace.

Input di Runtime per l'Hashing

I tuoi target possono dipendere anche da valori di runtime.

nx.json
{
"targetDefaults": {
"build": {
"inputs": [{ "env": "MY_ENV_NAME" }, { "runtime": "node -v" }]
}
}
}

Input degli Argomenti per l'Hashing

Infine, oltre agli Input Sorgente e Runtime, Lerna deve considerare gli argomenti: Ad esempio, lerna run build --scope=remixapp e lerna run build --scope=remixapp -- --flag=true producono risultati diversi.

Nota che solo i flag passati agli script npm stessi influenzano i risultati del calcolo. Ad esempio, i seguenti comandi sono identici dal punto di vista della cache.

npx lerna run build --scope=remixapp
npx lerna run build --ignore=header,footer

In altre parole, Lerna non memorizza nella cache ciò che lo sviluppatore digita nel terminale.

Se esegui build/test/lint... su più progetti, ogni build individuale ha il proprio valore di hash e verrà recuperata dalla cache o eseguita. Ciò significa che dal punto di vista della cache, il seguente comando:

npx lerna run build --scope=header,footer

è identico ai seguenti due comandi:

npx lerna run build --scope=header
npx lerna run build --scope=footer

Cosa viene Memorizzato nella Cache

Lerna opera a livello di processo. Indipendentemente dagli strumenti usati per build/test/lint ecc.. del tuo progetto, i risultati vengono memorizzati.

Lerna configura hook per raccogliere stdout/stderr prima di eseguire il comando. Tutto l'output viene memorizzato e riprodotto durante un cache hit.

Lerna memorizza anche i file generati da un comando. L'elenco di file/cartelle è specificato nella proprietà outputs del package.json del progetto:

NOTA: "{projectRoot}" e "{workspaceRoot}" sono sintassi speciali supportate dal task-runner, che verranno interpolate internamente durante l'esecuzione del comando. Non sostituire "{projectRoot}" o "{workspaceRoot}" con percorsi fissi poiché ciò riduce la flessibilità della configurazione.

E.g. packages/my-project/package.json
{
"nx": {
"targets": {
"build": {
"outputs": ["{projectRoot}/build", "{projectRoot}/public/build"]
}
}
}
}

Se la proprietà outputs per un target non è definita nel file package.json del progetto, Lerna cercherà nella sezione targetDefaults di nx.json:

nx.json
{
...
"targetDefaults": {
"build": {
"dependsOn": [
"^build"
],
"outputs": [
"{projectRoot}/dist",
"{projectRoot}/build",
"{projectRoot}/public/build"
]
}
}
}

Se nessuna delle due è definita, Lerna memorizzerà per default dist e build alla root del repository.

Saltare la Cache

A volte può essere utile saltare la cache. Ad esempio, per misurare le prestazioni di un comando, usa il flag --skip-nx-cache per evitare il controllo della cache.

npx lerna run build --skip-nx-cache
npx lerna run test --skip-nx-cache

Configurazione aggiuntiva

Per ulteriori metodi di configurazione di task e caching, consulta la relativa documentazione Nx.