こんにちは。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以外の環境でフォーマッターや静的解析を自動化したい場合は、ぜひ試してみて下さい。


コメント