LoginSignup
552
389

More than 5 years have passed since last update.

Goにはディレクトリ構成のスタンダードがあるらしい。

Posted at

Goにはディレクトリ構成のスタンダードがあるらしい。

参考URL

上記リポジトリには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
552
389
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
552
389