Vai al contenuto principale
Gli hook di installazione sono funzioni logiche speciali che vengono eseguite durante il ciclo di vita di installazione o aggiornamento. Condividono lo stesso runtime del gestore delle logic functions normali e ricevono un InstallPayload ({ previousVersion?: string; newVersion: string }previousVersion è undefined in una nuova installazione), ma sono dichiarati con le proprie funzioni di definizione e vivono al di fuori del normale modello di trigger (HTTP, cron, eventi del database). Ogni app può definire al massimo una funzione di pre-installazione e al massimo una funzione di post-installazione. La build del manifesto genera un errore se ne viene rilevata più di una per ciascun tipo.

A colpo d’occhio

Regola generale: usa post-install come impostazione predefinita. Ricorri al pre-install solo quando la migrazione stessa è distruttiva e devi intercettare lo stato precedente prima che vada perso.

Comportamento condiviso da entrambi gli hook

  • La config è una config di defineLogicFunction meno le impostazioni di trigger, più shouldRunOnVersionUpgrade.
  • Quando viene eseguito: solo sulle nuove installazioni, per impostazione predefinita. Imposta shouldRunOnVersionUpgrade: true per eseguirlo anche sugli upgrade. Usa previousVersion / newVersion per ramificare in base al percorso di upgrade.
  • L’idempotenza è importante: il post-install async può essere ritentato e qualsiasi hook viene rieseguito sugli upgrade quando shouldRunOnVersionUpgrade è attivo.
  • Il consueto ambiente delle logic-function (APPLICATION_ID, APP_ACCESS_TOKEN, API_URL) viene iniettato, così puoi chiamare le API di Twenty con il token della tua app.
  • L’hook viene collegato automaticamente al manifesto dell’applicazione in fase di build (preInstallLogicFunction / postInstallLogicFunction) — non c’è nulla da referenziare in defineApplication().
  • Il timeoutSeconds predefinito è 300 per consentire attività di setup più lunghe, come il seeding dei dati.
  • Non eseguito in modalità dev: yarn twenty dev salta il flusso di installazione e sincronizza direttamente i file, quindi gli hook non vengono mai eseguiti in quell’ambiente. Attivali invece manualmente:
Viene eseguito una volta che l’installazione della tua app è terminata: metadati sincronizzati, client SDK generato, nuovo schema interrogabile. Esempio — eseguire il seeding di un record predefinito nelle nuove installazioni:
src/logic-functions/post-install.ts
Il flag shouldRunSynchronously controlla il modello di esecuzione:
  • false (predefinito) — messo in coda nella message queue (retryLimit: 3) ed eseguito da un worker. La risposta dell’installazione ritorna non appena il job viene messo in coda. Da usare per lavoro di lunga durata — seeding di grandi dataset, API di terze parti lente.
  • true — eseguito inline durante il flusso di installazione. La richiesta di installazione rimane bloccata finché l’handler non termina; un errore lanciato viene esposto al chiamante come POST_INSTALL_ERROR (nessun retry). Da usare per lavoro rapido che deve completarsi prima della risposta. La migrazione è già stata applicata a questo punto, quindi un errore non annulla le modifiche allo schema — si limita a esporre l’errore.
Viene eseguito prima della migrazione dei metadati, contro lo schema precedente — il posto giusto per eseguire il backup di dati che una migrazione perderebbe o per rifiutare un upgrade rischioso. Prima dell’esecuzione, il server esegue una “sincronizzazione ridotta” puramente additiva che registra solo la funzione di pre-install della versione nuova; tutto il resto — oggetti, campi e dati della versione precedente — rimane intatto quando il tuo handler viene eseguito.Il pre-install è sempre sincrono e blocca l’installazione. Se l’handler genera un’eccezione, l’installazione viene interrotta prima che venga applicata qualsiasi modifica allo schema — il workspace rimane sulla versione precedente in uno stato coerente. Questo è intenzionale: il pre-install è la tua ultima possibilità per rifiutare un aggiornamento rischioso.Esempio — copiare i valori di un campo legacy prima che la migrazione lo elimini:
src/logic-functions/pre-install.ts