0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Go × Github Copilot Agent の開発環境とツールセット紹介

Posted at

このエントリでは、「どんな用途に、どのツールを使っているか」 にフォーカスして、私の Go 開発環境まわりを用途別にざっと紹介します。

リポジトリ: https://github.com/naka-sei/tsudzuri

  • 言語・ランタイム
  • ローカル開発(ホットリロード / Docker / Make)
  • DB / ORM
  • Observability(ログ・トレース)
  • API 定義 / コード生成
  • フォーマット / Lint
  • DI / テスト補助
  • CI(GitHub Actions)
  • VS Code の拡張と設定例
  • MCP / Serena

言語・ランタイム

Go

  • Go
    • 用途: バックエンド API の実装全般
    • 特徴: 単一バイナリでデプロイしやすく、標準ライブラリだけでも Web/API 開発に必要な機能が揃っている。
    • 公式: https://go.dev/

ローカル開発・ホットリロード

air

  • air
    • 用途: Go アプリのホットリロード(make dev で利用)
    • 特徴: ファイル変更を監視して自動ビルド・再起動してくれるので、API を触りながら素早く動作確認ができる。
    • 公式: https://github.com/air-verse/air

Docker / Docker Compose

  • Docker

    • 用途: アプリ本体のコンテナイメージをビルドし、ローカルでもコンテナで実行
    • 特徴: 本番用イメージをそのままローカルでも使えるので、「本番だけ動かない」を減らしやすい。
    • 公式: https://www.docker.com/
  • Docker Compose

    • 用途: API / DB / Swagger UI / テスト用 DB など複数コンテナの起動
    • 特徴: docker-compose.yaml 一つで「API + Postgres + Swagger UI」をワンコマンドで立ち上げられる。
    • 公式: https://docs.docker.com/compose/

Make

  • GNU Make
    • 用途: ローカル開発タスクのラッパー(make dev, make up, make test, make lint, make generate など)
    • 特徴: 複雑なコマンド列を Makefile に隠しておき、開発者は短いコマンドだけ覚えれば良いようにする。
    • 公式: https://www.gnu.org/software/make/

DB・ORM・マイグレーション

PostgreSQL

  • PostgreSQL
    • 用途: 永続化層のメイン RDB(本番・ローカル・テスト)
    • 特徴: OSS でメジャー。JSONB や拡張機能も多く、小さなサービスから大規模まで対応しやすい。
    • 公式: https://www.postgresql.org/

ローカルでは Docker Compose で Postgres コンテナを立ち上げ、テスト用には testdb サービスを用意しています。make test でテスト用 DB が自動起動し、pg_isready で起動待ち合わせしてから go test ./... を実行する構成です。

ent

  • ent
    • 用途: ORM / スキーマ定義(infrastructure/db/ent 以下)
    • 特徴: Go のコードでスキーマを書き、型安全なクエリやマイグレーションコードを生成できる。クエリも Go のコードとして完結するので、補完が効きやすい。
    • 公式: https://entgo.io/

スキーマ定義は ent に寄せつつ、ドメイン層ではリポジトリインタフェースだけを見るようにして、ORM への依存を infrastructure に閉じ込めています。


Observability(ログ・トレース)

OpenTelemetry

  • OpenTelemetry (otel)
    • 用途: 分散トレーシング・メトリクスの収集(cmd/api/otel.go, pkg/trace/ など)
    • 特徴: ベンダーロックインを避けつつトレース・メトリクスを集約できる標準的な仕組み。gRPC / HTTP 用のミドルウェアも揃っていて組み込みやすい。
    • 公式: https://opentelemetry.io/

zap / zapdriver

  • zap

    • 用途: 構造化ログの出力(pkg/log/
    • 特徴: 高速な構造化ロガー。JSON 形式でログを出して、後段のログ基盤で扱いやすくする。
    • 公式: https://github.com/uber-go/zap
  • zapdriver

    • 用途: GCP 系のログスタックと相性の良いフィールド(severity / trace など)を簡単に付与
    • 特徴: ログとトレースを紐づけるためのフィールドをきれいに整えてくれる。
    • 公式: https://github.com/blendle/zapdriver

API 定義・コード生成

Protocol Buffers / gRPC / gRPC-Gateway

  • Protocol Buffers (protobuf)

    • 用途: API のスキーマ定義(api/protobuf/
    • 特徴: 1 つのスキーマから gRPC / REST / OpenAPI など複数のインターフェースを生成できる。
    • 公式: https://protobuf.dev/
  • gRPC

    • 用途: バックエンドの RPC プロトコル
    • 特徴: HTTP/2 ベースで高速・型安全な通信を行える。サービス間通信にもそのまま流用しやすい。
    • 公式: https://grpc.io/
  • gRPC-Gateway

    • 用途: gRPC サービスから HTTP/JSON エンドポイントを自動生成
    • 特徴: 同じ proto から gRPC と REST を両対応させるためのブリッジとして使える。
    • 公式: https://github.com/grpc-ecosystem/grpc-gateway

buf

  • buf
    • 用途: protobuf の管理・コード生成(api/protobuf/buf.yaml, buf.gen.yaml
    • 特徴: 依存管理 / Lint / 生成をまとめて扱える Proto 用ツールチェーン。buf generate ひとつで gRPC / gRPC-Gateway / OpenAPI などを生成可能。
    • 公式: https://buf.build/

私の場合は make generate/protobuf/go から buf を呼び出し、proto の更新からコード生成までをまとめて回しています。


フォーマット・Lint・依存管理

gofumpt

  • gofumpt
    • 用途: Go コードの整形(make fmt
    • 特徴: gofmt をベースにした、より厳しめのフォーマッタ。プロジェクト全体で一貫したスタイルを維持しやすくなる。
    • 公式: https://github.com/mvdan/gofumpt

golangci-lint

  • golangci-lint
    • 用途: 静的解析・スタイルチェック(make lint や CI で実行)
    • 特徴: たくさんの Linters をまとめて走らせられる。CI での「最低限の品質ライン」を定義しやすい。
    • 公式: https://golangci-lint.run/

go modules / vendoring

  • go modules / go mod / vendoring
    • 用途: 依存関係管理(go.mod, go.sum, vendor/
    • 特徴: Go 標準の依存管理。go mod tidy や vendoring で再現性のあるビルドを目指す。
    • 公式: https://go.dev/ref/mod

make depsgo mod tidy / go mod verify / go mod vendor をまとめて実行し、依存関係の整合性を保つようにしています。


DI・テスト補助

wire

  • wire
    • 用途: 依存性注入のコード生成(cmd/api/wire.go
    • 特徴: コンパイル時 DI。Go のコードとして依存グラフを生成するので、ランタイムのリフレクションを避けつつ DI を活用できる。
    • 公式: https://github.com/google/wire

go-cmp / mock

  • go-cmp

    • 用途: テストでの構造体比較・差分表示
    • 特徴: 「どこが違うか」を見やすく表示してくれるので、テスト失敗時の原因特定がしやすい。
    • 公式: https://github.com/google/go-cmp
  • go.uber.org/mock

    • 用途: モック生成・テストダブル
    • 特徴: インターフェースからモックを自動生成し、ユースケースやドメインのテストを組みやすくする。
    • 公式: https://github.com/uber-go/mock

CI(GitHub Actions)

GitHub Actions

  • GitHub Actions
    • 用途: Lint / Test を自動で実行する CI
    • 特徴: .github/workflows に YAML を書くだけで、ブランチやタグに応じたパイプラインを柔軟に組める。
    • 公式: https://docs.github.com/actions

私の場合は、feature/** ブランチへの push をトリガーに:

  • make install-tools
  • make lint
  • make test

を自動で回すワークフローを用意しています。


VS Code の開発環境

私はプライベートでは VS Code を前提に開発しており、主に次の拡張を使っています。

  • Go (golang.go)
  • GitHub Copilot
  • GitHub Copilot Chat
  • Prettier SQL VSCode

VS Code 設定例 (settings.json)

{
    "terminal.integrated.suggest.enabled": true,
    "files.autoSave": "afterDelay",
    // Format on Save (保存時に整形) を有効化
    "editor.formatOnSave": true,
    "editor.insertSpaces": false,
    "editor.codeActionsOnSave": {
        "source.organizeImports": "explicit"
    },
    "go.lintOnSave": "package", // ファイル保存時にパッケージ全体をLintする
    "go.lintTool": "golangci-lint", // 使用するLinterツールを指定
    "go.useLanguageServer": true, // goplsを使用
    "go.formatTool": "gofumpt", // goplsに整形を任せる
    "go.lintFlags": [
        "--config=${workspaceFolder}/.golangci.yaml",
        "--fast" // 高速モードで実行
    ],
    "gopls": {
        // goplsが提供する一部の機能(静的解析)を無効化し、golangci-lintに任せる
        "analyses": {
            "unusedparams": false,
            "shadow": false
        },
        "completeUnimported": true // インポートされていないパッケージの補完を有効化
    },
    "github.copilot.nextEditSuggestions.enabled": true,
    "go.testEnvFile": "${workspaceFolder}/.env.local",
    "go.toolsEnvVars": {
        // goplsが使用する環境変数を設定
        "GOFLAGS": "-tags=wireinject"
    }
}

MCP / Serena

GitHub Copilot Chat に加えて Model Context Protocol (MCP) を利用し、リポジトリを横断したコードリーディングやリファクタリング支援を行います。

  • Serena (MCP サーバー)
    • 用途: コードベース全体のシンボル検索・参照検索・部分編集などを、Copilot から対話的に行うための MCP サーバー
    • 特徴: 「このユースケースに関連するドメイン・インフラ・テストをまとめて追いたい」といったときに、IDE 内でコードナビゲーションと編集をまとめて依頼できる。

.vscode/mcp.json に Serena の設定を置くことで、VS Code の Copilot Chat から「このプロジェクトを理解した状態の AI エージェント」として使えるようにしています。


まとめ

このエントリでは、私が Go の開発で使っているツールや VS Code の拡張機能を、用途別にざっと紹介しました。

  • 言語は Go、DB は PostgreSQL、ORM は ent
  • ローカル開発は Docker / Docker Compose + Make + air
  • Observability は OpenTelemetry + zap
  • API 定義は protobuf / gRPC / gRPC-Gateway を buf で管理
  • 品質管理は gofumpt / golangci-lint
  • DI / テスト補助に wire / go-cmp / mock
  • エディタは VS Code + Go 拡張 + Copilot + Prettier SQL
  • 裏側で MCP / Serena を使い、Copilot Chat からリポジトリ全体に対する操作を行っている

同じように Go で API を作るとき、「このあたりのツールを組み合わせるとこんな感じになる」というカタログとして使ってもらえたらうれしいです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?