Goにはディレクトリ構成のスタンダードがあるらしい。
上記リポジトリにはGOプロジェクトでのスタンダードとなるディレクトリ構成の説明が書いてある。一つずつ見ていくことにします。
/cmd
一番メインとなるディレクトリ。このディレクトリの中にアプリケーションのエントリーポイントを作る。
.
└── cmd
└── sampleapp
└── main.go
注意点としてはmain.go
に多くのことをさせないことである。各処理は基本的に後述する/pkg
などで実装していくのでそれをインポートする形を取るべきだとある。
/internal
/cmd
で作ったエントリポイントで使いたいライブラリをおく。だが、このライブラリは各アプリケーション毎に書かれるものとなるので他のアプリケーションと共有するライブラリは置かない。そうゆうのをおくとすれば、後述の/pkg
に置く。
├── cmd
│ └── sampleapp
│ └── main.go
└── internal
└── apps
└── sampleapp
├── pkg
│ └── hello.go
└── print.go
今回の例ではhello.go
とかprint.go
みたいなのが入ってあるがほんとはこんな共通化できるようなライブラリは入れてはならないので注意。
/pkg
このディレクトリがおそらく一番ファイルやディレクトリを配置することになるだろう。ここに置くライブラリは必ずどのアプリケーションから利用されてもいいように作成する必要がある。
.
├── cmd
│ └── sampleapp
│ └── main.go
├── internal
│ └── apps
│ └── sampleapp
│ ├── pkg
│ │ └── hello.go
│ └── print.go
└── pkg
└── compute
├── add.go
└── sub.go
例では計算用ライブラリを作って見た。その中のadd.go
を見てみる。
package compute
func Add(x int, y int) (int) {
return x + y
}
他に依存もしてないし、アプリケーションを選ばないように作った。
/vendor
これは特に考えることはないかと、自分で作ったライブラリを直接ここに置くことはしない。
/api
ここにはSwaggerとかAPIを作成する際のJSONファイルとかを入れる。
OpenAPI/Swagger specs, JSON schema files, protocol definition files.
/web
webページで使うtemplateとかimageとかcssとか入れとく。
/configs
コンフィグ系のテンプレートを入れとくフォルダ。自分のconfigは指定の配置に入れておこう。
/init
プロセスマネージャーがどうたらこうたら書いてある。使うことはあるのか?
/scripts
Makefile
みたいなのを配置する。
/build
Dockerfileとか色々配置する様子。go build
したものはここには入れないのかな?
/deployments
k8sとかのyamlファイルを配置して置くみたい。インフラ関係はここにおこう。
/test
外部テストとかはここにおこう。テストの時に使うデータはここに置いとくと管理がしやしいとかなんとか。
/docs
これは地味に大事、他の人に伝えたい情報などをドキュメント化して置くことは非常に大事なのでこのディレクトリは絶対に配置すべし。
まとめ
他にも/examples
とかあったのですが、解説するほどでもないのでまとめに入ります。
ディレクトリ構成はコーディングにも影響を及ぼすので大事です。プロジェクトごとに適切な構成にすることが必要。
.
├── cmd
│ └── sampleapp
│ └── main.go
├── configs
│ └── envrc.template
├── docs
│ ├── BUG.md
│ ├── ROUTING.md
│ └── TODO.md
├── internal
│ └── apps
│ └── sampleapp
│ ├── pkg
│ │ └── hello.go
│ └── print.go
├── pkg
│ └── compute
│ ├── add.go
│ └── sub.go
└── scripts
└── Makefile