effect-ts-resources について
Scope と acquireRelease を使ってリソースのライフサイクルを管理する Effect-TS スキルです。失敗や中断時にも解放処理を実行します。
主な機能
- 01acquireRelease による解放保証
- 02スコープ内のリソース管理
- 03LIFO 順でのクリーンアップ
- 04Scope へのファイナライザー追加
活用シーン
- 01データベース接続の管理
- 02ファイルのオープンとクローズ
- 03サーバーの起動やロックの取得
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ mrevanzak/ effect-ts-skills --skill effect-ts-resourcesインストール後、Claude Code で/effect-ts-resourcesを入力して読み込まれたか確認します。
詳細
Effect-TS のリソース管理
概要
Scope と acquireRelease を使用してリソースのライフサイクルを管理し、確実にクリーンアップします。プログラムが失敗、例外をスロー、または中断した場合でも、クリーンアップは必ず実行されます。
使用する場面
- 症状:リソースリーク(接続が終了しない)、手動の
try/finallyブロック、複雑なクリーンアップロジック。 - きっかけ:ファイルを開く、データベースに接続する、サーバーを起動する、ロックを取得する。
- 使用しない場面:単純なデータ変換や、明示的なクローズ/解放が不要な値を扱う場合。
基本パターン
手動の try/finally は中断処理を回避してしまうため、Effect ではエラーの原因になります。
| 反パターン(手動) | Effect のパターン(安全) |
|---|---|
try { conn.open() } finally { conn.close() } | Effect.acquireRelease(open, close) |
クイックリファレンス
| 関数 | 目的 |
|---|---|
Effect.acquireRelease | リソースの取得処理と、確実な解放処理を定義します。 |
Effect.scoped | スコープ内のすべてのリソースが解放される境界を作成します。 |
Effect.addFinalizer | 現在のスコープにクリーンアップ処理を追加します。 |
実装
1. acquireRelease パターン
失敗時や中断時でもクリーンアップが保証されます。
import { Effect } from 'effect';
const withDatabaseConnection = Effect.acquireRelease(
Effect.tryPromise(() => pool.connect()), // Acquire
(connection) => Effect.sync(() => connection.release()) // Release
);
const program = Effect.gen(function* () {
const conn = yield* withDatabaseConnection;
return yield* conn.query('SELECT * FROM users');
});
2. スコープ付きリソース
複数のリソースが同じライフサイクル境界を共有します。リソースは LIFO(後入れ先出し)順に解放されます。
import { Effect, Scope } from 'effect';
const program = Effect.scoped(
Effect.gen(function* () {
const db = yield* managedConnection;
const cache = yield* managedCache;
// Both cleaned up when scope closes (cache first, then db)
return yield* doWork(db, cache);
})
);
3. ファイルの処理
const withFile = (path: string) => Effect.acquireRelease(
Effect.tryPromise(() => fs.open(path, 'r')),
(handle) => Effect.promise(() => handle.close())
);
よくある間違い
try/finallyの使用:Effect の中断モデルを回避してしまいます。acquireReleaseを使用してください。Effect.scopedの指定忘れ:親スコープが閉じるまでリソースは解放されません(多くの場合、アプリの終了時です)。- 順序の誤り:リソースは取得順の逆順に解放されます。依存関係のあるリソースを先に取得してください。
必須の前提知識: 基本的なジェネレーターパターンについては effect-ts-fundamentals を使用してください。
コメント
Markdown 対応