PR

Go言語(Golang)開発でLefthookの使い方|pre-commitでformat・lint(静的解析)を自動化

4. ツール&環境

こんにちは。Tomoyuki(@tomoyuki65)です。

フロントエンドのチーム開発では、Node.js環境で利用できるHuskyといったライブラリを用いて、Gitのフックを使ったformat(コード整形)やlint(静的解析)の自動化をしたりします。

ただHuskyはNode.js環境用であり、Go言語(Golang)開発では直接使えないため、同じようなことをしたい場合は別のライブラリが必要になります。

そこで調べてみたところ、Go言語製の「Lefthook」というライブラリがよく使われているようなので、試しに使ってみました。

この記事では、そんなGo言語(Golang)開発でのLefthookの使い方についてご紹介します。

 

Go言語(Golang)開発でLefthookの使い方|pre-commitでformat・lint(静的解析)を自動化

インストール方法

Lefthookのインストールについては、macOSやLinuxでパッケージマネージャーのHomebrewを利用している場合、以下のコマンドで簡単にインストール可能です。

$ brew install lefthook

 

インストール後、以下のコマンドを実行し、コマンドをパスが通っていることを確認します。

$ lefthook -v

 

実行後、以下のようにバージョンが表示されればパスが通っているのでOKです。

 

Go言語(Golang)の開発でlefthookを試す準備

次にGo言語(Golang)のスクリプト開発を例にlefthookを試すため、Goのスクリプトを準備します。

まずは以下のコマンドを実行し、各種ファイルを作成します。

$ mkdir go-lefthook && cd go-lefthook
$ mkdir -p docker/local/go && touch docker/local/go/Dockerfile
$ mkdir -p src && touch src/main.go
$ touch compose.yml

※この記事ではDocker環境を利用します。試したい場合は事前にDockerを使えるようにして下さい。

 

次に作成したファイルをそれぞれ以下のように記述します。

・「docker/local/go/Dockerfile」

FROM golang:1.26.1-alpine3.23

WORKDIR /go/src

COPY ./src .

# go.modがあれば依存関係をインストール
RUN if [ -f ./go.mod ]; then \
  go install; \
fi

# 開発用のライブラリをインストール
RUN go install honnef.co/go/tools/cmd/staticcheck@latest

EXPOSE 8080

※Go言語の静的解析用のライブラリとして「staticcheck」を入れます。

 

・「src/main.go」

package main

import (
    "fmt"
)

func main() {
    fmt.Println("Hello World !!")
}

 

・「compose.yml」

services:
  app:
    container_name: go-app
    build:
      context: .
      dockerfile: ./docker/local/go/Dockerfile
    volumes:
      - ./src:/go/src
    ports:
      - "8080:8080"

 

次に以下のコマンドを実行し、Dockerコンテナのビルドをします。

$ docker compose build --no-cache

 

次に以下のコマンドを実行し、Go言語の初期化をします。

$ docker compose run --rm app go mod init go-lefthook

 

次に以下のコマンドを実行し、Go言語のスクリプトを実行します。

$ docker compose run --rm app go run main.go

 

実行後、「Hello World !!」が出力されればOKです。

 

次に以下のコマンドを実行し、gitの初期化およびコミットまで実行します。

$ git init
$ git add -A
$ git commit -m "init"

※もしまだGitをインストールしていない場合は、事前に準備して下さい。

 

lefthookの導入

次に以下のコマンドを実行し、lefthookを導入します。

$ lefthook install

 

コマンド実行後、ファイル「lefthook.yml」が作成されます。

 

次にファイル「lefthook.yml」を以下のように修正し、コミット実行時にフォーマッターと静的解析を実行するようにします。

pre-commit:
  parallel: true
  commands:
    fmt:
      run: docker compose run --rm app go fmt ./...
    staticcheck:
      run: docker compose run --rm app staticcheck ./...

 

lefthookを試す

次にファイル「src/main.go」を以下のように修正し、静的解析でエラーがでるようにします。

package main

import (
    "fmt"
)

func main() {
var str string
    fmt.Println("Hello World !!")
}

 

次に以下のコマンドを実行し、コミット処理でlefthookが実行されるか試します。

$ git add -A
$ git commit -m "add lefthook"

 

コミット実行後、lefthookの処理が実行されてfmtが成功し、staticcheckがエラーになってコミットが完了しなければOKです。

 

ファイル「src/main.go」確認すると、fmtは成功しているのが確認できます。

 

次にコミットできるようにファイル「src/main.go」を以下のように修正します。

package main

import (
    "fmt"
)

func main() {
    fmt.Println("Hello World !!")
}

 

次に以下のコマンドを実行し、コミットできることを確認します。

$ git add -A
$ git commit -m "add lefthook"

 

コミット実行後、以下のように成功すればOKです。

 

Gitプッシュ時にコマンドを実行したい場合について

ファイル「lefthook.yml」で「pre-push」を使えば、Gitプッシュ時にコマンドを実行させることも可能です。

・Gitプッシュ時にテストを実行させる例

pre-commit:
  parallel: true
  commands:
    fmt:
      run: docker compose run --rm app go fmt ./...
    staticcheck:
      run: docker compose run --rm app staticcheck ./...
pre-push:
  commands:
    go-test:
      run: docker compose run --rm app go test ./...

 

チーム開発で利用する際の注意点

チーム開発で使う場合は、コミット処理をする前に事前に「Lefthook」をインストールしておく必要があるため、その点は対象メンバーにしっかり共有して下さい。

※「Lefthook」をインストールしてないとチェックがされない

 

AIツールを利用した開発でも必要?

最近だとAIツール「Claude Code 」などで開発していて、AIツールからコミット処理をさせるということもありますが、その場合もコミット処理時に起動してチェックされるため、チーム開発においては有効です。

このようなチェックはAIツールのAgent Skillsでも同じようなことをさせられますが、Lefthookのようなライブラリを直接使った方が確実性が高くて安定しているため、AIツールを利用した開発においてもライブラリを使ってやった方がいいと思います。

 

スポンサーリンク

最後に

今回はGo言語(Golang)開発でのLefthookの使い方についてご紹介しました。

実務などのチーム開発においては、Lefthookのようなライブラリを用いた仕組みかは必須です。

特に近年のAIツールでの開発でも有効なものなので、GoなどのNode.js以外の環境でフォーマッターや静的解析を自動化したい場合は、ぜひ試してみて下さい。

 

コメント

タイトルとURLをコピーしました