mcpField
E
encore-go-service

encore-go-service

github.com/encoredev開発30569 回インストール2 日前に更新
リポジトリ

encore-go-service について

Encore.go アプリケーションのサービスとパッケージ構成を扱う、Go 開発者向けガイドです。API を持つパッケージがサービスになる仕組み、サービス間呼び出し、共有ヘルパーパッケージの配置を説明します。

主な機能

  1. 01API エンドポイントを持つパッケージのサービス化
  2. 02単一・複数サービスの構成
  3. 03システム単位のサービス分類
  4. 04サービス間の直接呼び出し
  5. 05共有する非サービスパッケージ

活用シーン

  1. 01アプリケーションのサービス境界の決定
  2. 02複数サービスの Go プロジェクト構成
  3. 03再利用可能なヘルパーコードの整理

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/encoredev/skills --skill encore-go-service

インストール後、Claude Code で/encore-go-serviceを入力して読み込まれたか確認します。

詳細

Encore.go のサービス構造

手順

Encore.go では、API エンドポイントを持つ各パッケージが自動的にサービスになります。特別な設定は必要ありません。

サービスの作成

少なくとも 1 つの //encore:api エンドポイントを持つパッケージを作成するだけです:

// user/user.go
package user

import "context"

type User struct {
    ID    string `json:"id"`
    Email string `json:"email"`
    Name  string `json:"name"`
}

//encore:api public method=GET path=/users/:id
func GetUser(ctx context.Context, params *GetUserParams) (*User, error) {
    // This makes "user" a service
}
最小限のサービス構造
user/
├── user.go          # API endpoints
├── db.go            # Database (if needed)
└── migrations/      # SQL migrations
    └── 1_create_users.up.sql

アプリケーションのパターン

単一サービス

アプリケーションは、その API を 1 つのルートサービスパッケージで定義できます:

my-app/
├── encore.app
├── go.mod
├── api.go           # All endpoints
├── db.go            # Database
└── migrations/
    └── 1_initial.up.sql
マルチサービス

各サービスはそれぞれ独自のパッケージに配置します:

my-app/
├── encore.app
├── go.mod
├── user/
│   ├── user.go
│   ├── db.go
│   └── migrations/
├── order/
│   ├── order.go
│   ├── db.go
│   └── migrations/
└── notification/
    └── notification.go
大規模アプリケーション (システムベース)

関連するサービスをシステムにグループ化します:

my-app/
├── encore.app
├── go.mod
├── commerce/
│   ├── order/
│   │   └── order.go
│   ├── cart/
│   │   └── cart.go
│   └── payment/
│       └── payment.go
├── identity/
│   ├── user/
│   │   └── user.go
│   └── auth/
│       └── auth.go
└── comms/
    ├── email/
    │   └── email.go
    └── push/
        └── push.go

サービス間呼び出し

関数をインポートして直接呼び出すだけです - Encore が RPC を処理します:

package order

import (
    "context"
    "encore.app/user"  // Import the user service
)

//encore:api auth method=GET path=/orders/:id
func GetOrderWithUser(ctx context.Context, params *GetOrderParams) (*OrderWithUser, error) {
    order, err := getOrder(ctx, params.ID)
    if err != nil {
        return nil, err
    }
    
    // This becomes an RPC call - Encore handles it
    orderUser, err := user.GetUser(ctx, &user.GetUserParams{ID: order.UserID})
    if err != nil {
        return nil, err
    }
    
    return &OrderWithUser{Order: order, User: orderUser}, nil
}

内部ヘルパー (非サービスパッケージ)

共有コード用に、//encore:api エンドポイントを持たないパッケージを作成します:

my-app/
├── user/
│   └── user.go       # Service (has API)
├── order/
│   └── order.go      # Service (has API)
└── internal/
    ├── util/
    │   └── util.go   # Not a service (no API)
    └── validation/
        └── validate.go

ガイドライン

  • パッケージは //encore:api エンドポイントを持つとサービスになります
  • サービスを他のサービス内に入れ子にすることはできません
  • サービス間呼び出しは通常の関数呼び出しのように記述します
  • 各サービスは独自のデータベースを持つことができます
  • パッケージ名は小文字で、内容を表す名前にする必要があります
  • コード整理のためだけにサービスを作成しないでください - 代わりにサブパッケージを使用してください
  • サービスの境界が決まっていない場合は encore-architecture を使用してください

コメント