はじめに
- Go Modules で stringer や lint など開発用のツールを依存パッケージとして管理する方法についてまとめます。
Go Modules で開発ツールを管理できない問題
- stringer などの開発ツールを go get すると一時的に go.mod に記載されますが、コードの中で import されていないため go mod tidy すると go.mod から外れてしまいます。
解決策
- コード中で import されてさえいれば Go Modules の管理対象にできるので、開発ツールを import するだけのファイルをおいておきます。
- ファイル名は何でも良いのですがとりあえず
tools.go
で統一しておくとわかりやすいかもしれません。
tools.go
// +build tools
package main
import _ "golang.org/x/tools/cmd/stringer"
解説
- 行頭の
// +build
はビルドタグと呼ばれるもので、go build 時に固有環境向けのコードを実装するために利用されます - tools.go のビルドタグには
// +build tools
と記載されているため tools タグがある場合のみコンパイル対象になります - 実際には tools タグ付きでビルドされることはないので、実行時に何らかの影響を与えることなく Go Modules のために開発ツールを import するということが tools.go によって実現されています。
- かなりバッドノウハウっぽいですが、Go Modules の Wiki に記載されている手法なのでとりあえずこうしておくのが良さそうです。