Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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
Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away