背景
Go で project を作る時に directory 構造をどうするかは議論がある。
公式と非公式の間みたいな資料 (project layout )がずっと参照されていたが、ついに公式からある程度の指針が示された。
Organizing a Go module - The Go Programming Language
短い内容なので、私なりのメモを残す。
内容
package
go で package を作るなら
- github.com/someuser/modname
という名前にする。
- modname.go
は package modname
で書き始める。
すると利用側は
import "github.com/someuser/modname"
と書ける。
Command Line Tool
CLI ツールなどを作る場合は普通に main.go を作り、同様にmodule名を設定する。
利用側は
go install github.com/someuser/modname@latest
と書ける。
大きな Package や依存 package を作る場合
internal/
directory を作って package を区切る。
modname.go
で露出していない内部 API は refactor や変更をしやすくなる。
複数 package あっても同様に複数のdirectory を切ればいい
Package と Command が両方入る場合
project-root-directory/ go.mod modname.go modname_test.go auth/ auth.go auth_test.go internal/ ... internal packages cmd/ prog1/ main.go prog2/ main.go
auth, internal は import して使われつつ、 progX は go install
できる。
Server がある場合
project-root-directory/ go.mod internal/ auth/ ... metrics/ ... model/ ... cmd/ api-server/ main.go metrics-analyzer/ main.go ... ... the project's other directories with non-Go code
サーバーとして使う場合、export することはあまりないので、internal に logic を全て実装する。
Go 以外のファイルが必要になることも多々あるので、internal 以外のgo ファイルも cmd/ に全て入れる。
感想
ちょうど Cobra でCLI ツールを作ろうとしていたが、 main.go と同じ階層に cmd/ が自動で作られる点で、この推奨パターンとは少し異なっているかもしれない。
Server を開発する場合に go ファイルをできるだけroot に置かないようにする、というのは次回から取り入れたい。 たしかにroot はよく散らかってしまう。
短かったのでサクッと読めてよかった。