using-backstage-catalog について
using-backstage-catalog は、Backstage のフロントエンドおよびバックエンドプラグインでカタログ操作を実装するためのスキルです。エンティティの取得・検索やカタログロケーションの管理方法に加え、認証情報、非同期取得、よくある注意点を説明します。
主な機能
- 01参照によるエンティティ取得
- 02フィルターによるエンティティ検索
- 03ロケーションの登録・更新・解除
- 04フロントエンドとバックエンドのパターン
- 05認証情報と非同期取得のガイダンス
活用シーン
- 01プラグイン内でカタログエンティティを検索
- 02条件に一致するエンティティを一覧表示
- 03カタログロケーションをプログラムから管理
- 04スキャフォールド済みプラグインにカタログ操作を追加
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ vinzscam/ backstage-skills --skill using-backstage-catalogインストール後、Claude Code で/using-backstage-catalogを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/fetch-by-ref.mdquery-entities.mdregister-entity.md詳細
Backstage カタログのパターン
このスキルを使用する場面
- プラグインで、ref を指定して特定のエンティティ(Group、Component、User など)を取得する必要がある場合
- プラグインで、フィルターを使ってエンティティをクエリする必要がある場合(特定のチームが所有するすべての Component、指定したタイプのすべての Group など)
- プログラムから新しいカタログのロケーションを登録したり、エンティティを更新したり、ロケーションの登録を解除したりする必要がある場合
- フロントエンドコードとバックエンドコードの両方に適用できます。エントリーポイントは異なりますが、操作は同じです
適切なパターンの選択
フロントエンド(フロントエンドプラグインのコンポーネント内)
| 状況 | パターン | リファレンス |
|---|---|---|
| ref で単一のエンティティを取得する | useApi(catalogApiRef).getEntityByRef(ref) | references/fetch-by-ref.md (フロントエンドのセクション) |
| フィルターを使ってエンティティをクエリする | useApi(catalogApiRef).getEntities({ filter }) | references/query-entities.md (フロントエンドのセクション) |
| ロケーションを登録/更新/登録解除する | useApi(catalogApiRef).addLocation / refreshEntity / removeLocationById | references/register-entity.md (フロントエンドのセクション) |
バックエンド(バックエンドプラグインまたはモジュール内)
| 状況 | パターン | リファレンス |
|---|---|---|
| ref で単一のエンティティを取得する | catalog.getEntityByRef(ref, { credentials }) を catalogServiceRef 経由で呼び出す | references/fetch-by-ref.md (バックエンドのセクション) |
| フィルターを使ってエンティティをクエリする | catalog.getEntities({ filter }, { credentials }) を catalogServiceRef 経由で呼び出す | references/query-entities.md (バックエンドのセクション) |
| ロケーションを登録/更新/登録解除する | catalog.addLocation / refreshEntity / removeLocationById を catalogServiceRef 経由で呼び出す | references/register-entity.md (バックエンドのセクション) |
2 つの呼び出しモード
- スタンドアロン(開発途中):ユーザーが既存のプラグインを編集中です。上の状況一覧から適切なリファレンスを選び、適用します。
- スキャフォールド後(
creating-backstage-pluginから呼び出される場合):新たにスキャフォールドされたプラグインにパターンを適用します。各リファレンスの「スキャフォールド後の使用」セクションにファイルと挿入箇所が記載されています。frontend-template のスキャフォールドではフロントエンドのパターンを、backend-template のスキャフォールドではバックエンドのパターンを使用します。
よくある注意点
- フロントエンドのコードでは、
catalogApiRefは@backstage/plugin-catalog-reactから取得します。@backstage/catalog-clientではありません。後者はバックエンド用です。 - NFS プラグインでは、
useApi自体は@backstage/frontend-plugin-apiから取得します。catalogApiRefはプラグイン固有であり、@backstage/plugin-catalog-reactのままです。 - バックエンドのコードでは、
@backstage/plugin-catalog-nodeのcatalogServiceRefに依存します。これは認証とディスカバリーの設定が済んだ状態でカタログクライアントをラップし、BackstageCredentialsを直接受け取ります。メソッドには{ credentials }(BackstageCredentialsオブジェクト)を渡します。{ token }(文字列)ではありません。受信した HTTP リクエストでは、httpAuth.credentials(req)で認証情報を取得します。サービス間の処理(スケジュールされたタスクや初期化時のフェッチ)では、auth.getOwnServiceCredentials()を使用します。手動でnew CatalogClient(...)を作成しないでください。これは基盤となる API ですが、標準的なインターフェースはサービス参照です。 getEntityByRefはEntity | undefinedを返します。エンティティが削除されている場合や、参照が不正な場合があるため、必ずundefinedのケースを処理してください。getEntitiesは{ items: Entity[] }を返します。分割代入するか、.itemsにアクセスしてください。getEntitiesのフィルターは、1 つのオブジェクト内では AND 条件、オブジェクトの配列では OR 条件で結合されます。- フロントエンド:レンダー中にフェッチしないでください。
react-useのuseAsync(マウント時または依存関係の変更時に自動フェッチ)かuseAsyncFn(ボタン操作でフェッチ)でラップしてください。{ loading, error, data }のためにuseStateを手動で設定しないでください。このフックは競合状態やアンマウント時のクリーンアップを適切に処理します。 - バックエンド:キャッシュなしで HTTP リクエストのたびにフェッチしないでください。頻繁にアクセスされる処理では、常に最新のデータが必要ない結果をメモ化するために
coreServices.cacheを使用してください。
UI の規約
可能な場合は、描画に @backstage/ui(Skeleton、Alert、Text、Flex、Button など)を使用してください。コンポーネントの一覧とスタイリングのガイダンスについては、using-backstage-ui スキルを参照してください。
コメント
Markdown 対応