Skip to main content
インストールフックは、インストール、アップグレード、またはアンインストールのライフサイクル中に実行される特別なロジック関数です。 これらは通常のロジック関数と同じハンドラーランタイムを共有しますが、独自の define 関数で宣言され、通常のトリガーモデル (HTTP、cron、データベースイベント) の外側で動作します。 インストールフックは InstallPayload ({ previousVersion?: string; newVersion: string } — 新規インストールでは previousVersionundefined) を受け取り、アンインストールフックは UninstallPayload ({ version?: string } — 削除されるバージョン) を受け取ります。 各アプリは、各フック (プレインストール、ポストインストール、アンインストール) を 最大 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

アンインストールフック

defineUninstallLogicFunction は、ユーザーがアプリをアンインストールしたときに実行されるフックを宣言します。 これは、アプリのメタデータ、データ、コードが削除される 前に 実行されます。削除マイグレーションが実行された後には、実行できるものは何も残らないため、ハンドラーはまだアプリのオブジェクトやレコードをクエリできます。 これを、外部リソースのクリーンアップに使用します。API リソースのプロビジョニング解除、残っているボットの削除、webhook の失効などです。 注記:
  • このフックはベストエフォートで動作します。同期的に実行されますが、失敗してもログに記録されるだけであり、アンインストールをブロックすることは決してありません。クリーンアップ処理が原因でアプリを削除できなくなってはなりません。
  • これは UninstallPayload ({ version?: string } — 削除されるバージョン) を受け取ります。
  • 新規インストールの失敗によりロールバックされた場合には実行されません。アプリのインストールが最後まで完了していないためです。
  • このフックは、アプリが削除された後には実行できないため、アプリデータ (レコードに保存されたボット ID など) に依存する外部クリーンアップ処理は、外部のスケジュールジョブではなく、ここに実装する必要があります。
  • インストールフックと同様に、これは dev モードでは実行されません。代わりに手動でトリガーしてください:
src/logic-functions/uninstall.ts