Goパッケージの配置ルールとディレクトリ構成

これまで適当な場所にコードを置いて開発していたのですが、なにやら流儀があるようだったので、見直すことにしました。

パッケージの作成場所

新たに独自のパッケージを作成する場合は $GOPATH/src/github.com/username 配下におくのが良いようです。

usernameはgithubのユーザ名です。

ディレクトリ構成

みんなのGo言語 という本では下記のような構成をサンプルとして提唱していました。

$GOPATH/src/github.com/username/mygoapp/
├── Makefile
├── README.md
├── _tools/
├── cmd/
│   └── mygoapp/
│       └── main.go
├── go.mod
├── internal/
├── logger/
│   └── logger.go
├── mygoapp.go
├── mygoapp_test.go
├── testdata/
├── type.go
├── type_test.go
└── version.go

$GOPATH/src/github.com 配下に mygoapp というパッケージ名でディレクトリを作成しています。

ディレクトリ名と、パッケージのファイル名は別々でも良いようですが、ファイルの冒頭に記載する package hogehoge は、ディレクトリと名と一致させた方が良い。

Makefile はビルド、タスクランナーとして使います。このファイルに、ビルドやテスト時に実行するコマンドを記載しておけば、 make コマンドを叩くだけで記述内容にしたがってコンパイルされます。Dockerで構築されたミニマムな環境の場合は、Dockerfileを利用する方が良いかもしれません。

testdata_ で始まるディレクトリはGoのパッケージとはみなされないので、ここにGo以外のコードやファイルを置くことが出来ます。

go.mod は依存関係のモジュールが管理されているファイル。RubyのGemfileのようなもの。

上記の構成以外だと、 https://github.com/golang-standards/project-layout などが有名みたいです。

まとめ

「動きゃいいんだよ〜」と雰囲気でディレクトリを切ってましたが、これを機に、デファクトに近づけていこうと思います。