メインコンテンツへスキップ
インストールフックは、インストールまたはアップグレードのライフサイクル中に実行される特別なロジック関数です。 これらは通常のロジック関数と同じハンドラーランタイムを共有し、InstallPayload{ previousVersion?: string; newVersion: string } — 新規インストールでは previousVersionundefined)を受け取りますが、独自の define 関数で宣言され、通常のトリガーモデル (HTTP、cron、データベースイベント) の外側で動作します。 各アプリは、プレインストール関数は最大 1 つポストインストール関数も最大 1 つまで定義できます。 どちらかが複数検出された場合、マニフェストのビルドはエラーになります。

ひと目でわかる概要

経験則: 既定では post-install を使用する。 マイグレーション自体が破壊的で、消える前の状態を先に扱う必要がある場合にのみ、pre-install を使ってください。

両方のフックに共通する動作

  • 設定は、トリガー設定を除いた defineLogicFunction の設定に shouldRunOnVersionUpgrade を加えたものです。
  • 実行タイミング: 既定では新規インストール時のみ。 アップグレード時にも実行するには、shouldRunOnVersionUpgrade: true を設定します。 previousVersion / newVersion を使って、アップグレードパスに応じて分岐させます。
  • べき等性が重要です: 非同期 post-install は再試行される可能性があり、さらに shouldRunOnVersionUpgrade が有効な場合はいずれのフックもアップグレード時に再実行されます。
  • 通常のロジック関数の環境(APPLICATION_IDAPP_ACCESS_TOKENAPI_URL)が注入されるため、アプリのトークンを使って Twenty API を呼び出せます。
  • フックはビルド時に自動的にアプリケーションマニフェストにアタッチされます(preInstallLogicFunction / postInstallLogicFunction)。defineApplication() 内で参照する必要はありません。
  • デフォルトの timeoutSeconds は 300 に設定されており、データシーディングのような長めのセットアップ作業を許容します。
  • 開発モードでは実行されません: yarn twenty dev はインストールフローをスキップしてファイルを直接同期するため、フックはそこで一切実行されません。 代わりに手動でトリガーしてください:
アプリのインストールが完了した後に実行されます: メタデータは同期され、SDK クライアントが生成され、新しいスキーマはクエリ可能な状態になります。 例 — 新規インストール時に既定のレコードをシードする:
src/logic-functions/post-install.ts
shouldRunSynchronously フラグは実行モデルを制御します:
  • false (既定) — メッセージキューに投入され(retryLimit: 3)、ワーカーによって実行される。 ジョブがキューに投入されるとすぐにインストールのレスポンスが返ります。 長時間実行される処理に使用 — 大規模データセットのシーディング、低速なサードパーティ API など。
  • true — インストールフロー中にインラインで実行される。 ハンドラーが終了するまでインストールリクエストはブロックされます。スローされたエラーは POST_INSTALL_ERROR として呼び出し元に伝播します(再試行なし)。 高速かつ、レスポンス前に完了している必要がある処理に使用します。 この時点ではマイグレーションはすでに適用済みであるため、失敗してもスキーマ変更はロールバックされず、エラーが表面化するだけです。
メタデータマイグレーションの前、以前のスキーマに対して実行されます — マイグレーションで失われるデータをバックアップしたり、リスクの高いアップグレードを拒否したりするのに適した場所です。 実行前に、サーバーは純粋に追加のみの「簡易同期」を実行し、新しいバージョンのプレインストール関数だけを登録します。あなたのハンドラーが実行される際には、それ以外 — 以前のバージョンのオブジェクト、フィールド、データ — には一切手を触れません。プレインストールは常に同期的であり、インストールをブロックします。 ハンドラーがスローした場合、スキーマ変更が行われる前にインストールは中止され、ワークスペースは一貫した状態のまま前のバージョンに留まります。 これは意図的な設計です。プレインストールは、リスクの高いアップグレードを拒否できる最後の機会です。例 — マイグレーションでレガシーフィールドが削除される前に、その値をコピーする:
src/logic-functions/pre-install.ts