Quando una build App Builder fallisce: leggi il registro, trova la causa, costruisci di nuovo
App Builder compila i programmi di un’app a partire dalle ricette, una dopo l’altra. Una di esse può fallire. Questa guida segue un errore reale su un NAS di test: TurboShell, con 70 ricette, si è fermata alla settima, la shell Korn ksh93.
- Dovela ricetta fallita
- Logle ultime righe
- Causanome dell'errore
- Modificaricetta corretta o app
- Nuova buildriutilizza le ricette riuscite
Le immagini provengono da Bucket & Code Server IDE 1.0.0-49, prima e dopo la correzione.
01Dove ha fallito
Una build fallita non modifica l’app funzionante. Se una build precedente è riuscita, Attiva, Scarica e Esporta come QPKG continuano a usare quel risultato. La barra laterale indica l’ultima build come fallito e la pagina dell’app mostra l’errore nella pipeline.

La scheda Ordine di build indica la ricetta e la fase dell’errore. In questo esempio le ricette precedenti risultano superata; quelle successive sono non raggiunta e conservano il log di una build precedente.
02Leggi il registro della ricetta
Il pulsante Log nella riga della ricetta apre ciò che il builder ha scritto per quella ricetta: le sue fasi, l'output del compilatore, l'audit e il controllo. La causa si trova verso la fine.
- Anche il log del job di compilazione, sotto Job nel pannello inferiore (Ctrl+J), termina con le stesse righe: il builder vi copia le ultime 40 righe del log della ricetta.
- L'albero di build della ricetta non riuscita rimane nella cartella di build dell'app fino alla build successiva dell'app:
apps/<app>/build/work/<recipe>nella cartella dei dati. Aprilo nel terminale dell'editor per guardare i sorgenti e i file generati.
03Trova la causa
Il compilatore richiede Magic_t, il tipo proprio di ksh, e suggerisce magic_t, il tipo di libmagic, la libreria del comando file. Quindi #include <magic.h> nei sorgenti di ksh ha trovato l'intestazione di libmagic, non quella di ksh.
TurboShell compila anche la ricetta file, che installa l'header magic.h di libmagic nel prefisso dell'app. Ogni ricetta viene compilata con la cartella include di quel prefisso nel percorso di ricerca, così i suoi programmi trovano le librerie compilate prima di loro. La prima build di TurboShell ha compilato ksh93 prima di file ed è riuscita. Una build successiva lavora su una copia dell'ultima build riuscita, il cui prefisso conteneva già l'header di libmagic, e ksh93 ha preso quello.
Quando un errore nomina qualcosa, come in questo caso, segui quel nome a ritroso nei sorgenti, nelle ricette precedenti e nell'ambiente di compilazione. Il log mostra dove si è fermata questa build; non ti dice quale modifica risolverà il problema.
04Cosa puoi modificare
- Una ricetta corretta. Un catalogo firmato può distribuire nuove ricette al NAS tra le versioni dell’app. La scheda Libreria di ricette nella pagina App mostra la versione usata e l’ultima verifica; Cerca aggiornamenti delle ricette avvia subito una verifica. La ricetta corretta
ksh93è arrivata con il catalogo 2026.10.08-1 e isolaksh93dagli header del prefisso.
- L’app. Con Cambia nella pagina dell’app puoi aggiungere o rimuovere ricette e impostare ambiente e modalità di collegamento. Un programma in conflitto con un’altra ricetta può essere compilato in un’app separata.
- L'ambiente. Se una ricetta ha bisogno di un compilatore più recente o di uno strumento di compilazione che manca nell'ambiente, scegli un altro ambiente con Cambia.
05Cambia tu il sorgente di una ricetta
Finché non arriva una ricetta corretta, o quando un programma ha una versione più recente di quella che compila la ricetta della libreria, una copia della ricetta può indicare il nuovo sorgente. La copia va nella cartella recipes/ di un tuo progetto qualsiasi, e un’app che prende le ricette di quel progetto compila la copia al posto della ricetta della libreria. La libreria e le altre app restano come sono. Nella libreria di Bucket & Code Server IDE 1.0.0-55 la ricetta tmux compila la versione 3.7c; la copia qui compila la 3.8.
Il registro del job di compilazione indica la libreria in uso nella riga recipe library:. La libreria del pacchetto è /usr/bin/bucketvs/share/bucketvs/recipes/; quella di un catalogo è recipes/current/library/ nella cartella dei dati. Nel terminale dell’editor, nella cartella del progetto, copia da lì la cartella della ricetta e calcola lo sha256 del nuovo archivio:
mkdir -p recipes
cp -r /usr/bin/bucketvs/share/bucketvs/recipes/tmux recipes/
curl -fsSL https://github.com/tmux/tmux/releases/download/3.8/tmux-3.8.tar.gz | sha256sum
e79c699c7e949dccd0a4a125e17b8d1261e311b16979dbc8eb34542f3966d82e -
In recipes/tmux/recipe.json cambiano tre valori: la versione, l’indirizzo e lo sha256.
"version": "3.8",
"source": {
"url": "https://github.com/tmux/tmux/releases/download/3.8/tmux-3.8.tar.gz",
"sha256": "e79c699c7e949dccd0a4a125e17b8d1261e311b16979dbc8eb34542f3966d82e"
},
- Al salvataggio del file vengono controllate le ricette del progetto e i risultati compaiono nella vista Problemi dell’editor;
bvs recipe lint .esegue lo stesso controllo nel terminale. La scheda Ricette della vista del progetto segna la copia con sostituisce la versione 3.7c della libreria. Una copia con un problema viene esclusa, e la ricetta della libreria non prende il suo posto: una compilazione che richiedetmuxsi ferma prima di partire, indicando il motivo. - Nella pagina dell’app, Cambia mostra Ricette da un progetto appena un progetto contiene una ricetta. Scegli il progetto, Salva la modifica, poi Ricompila. Il registro del job di compilazione elenca le ricette lette dal progetto e riporta
tmux replaces the library's tmux 3.7c in this app. - Una versione che si compila allo stesso modo richiede solo questi tre valori. Se servono altre opzioni di configure o una patch, modifica anche
build.sh; La tua prima ricetta spiega quel file. - La copia sostituisce la ricetta della libreria per nome, a prescindere dalle versioni. Quando la ricetta della libreria supera la copia, l’app continua a compilare la copia: riporta Ricette da un progetto su Nessuno: solo la libreria, oppure elimina la copia.
06Compila di nuovo
Ricompila nella pagina dell’app avvia un nuovo job di compilazione. Se i file dell’app non sono cambiati dopo la build fallita, la compilazione riprende dal punto in cui quella build si è fermata: le ricette già completate vengono riutilizzate e quella fallita viene compilata di nuovo, qui ksh93 con la ricetta corretta del catalogo.


07Quando la compilazione viene completata ma un programma non si avvia
Ogni build controlla il suo risultato prima di sostituire l'app: il controllo di ogni ricetta e un'analisi che legge ogni programma e libreria senza eseguirli. La scheda Dipendenze dell'app elenca ciò che ha trovato l'analisi: una libreria mancante, una versione che una libreria non definisce, un RUNPATH che punta all'esterno dell'app o un programma che richiede una glibc più recente di quella per cui è pensata l'app. Il pannello offre un'azione suggerita per i risultati supportati, spesso sotto forma di pulsante: Aggiungi … e compila, Passa a … e compila, Correggi il RUNPATH, Scegli un altro ambiente o Compila solo per questo NAS. Sul NAS, bvs deps <app> stampa lo stesso elenco.