ローカル(ソース非公開)プロジェクトでGo言語の推奨ディレクトリ構成(golang-standards/project-layout)を使う
go version go1.15.2。
推奨ディレクトリ構成に従い、標準のパッケージ管理システムである「Go Modules」を使おうとして微妙にハマったのでメモ。
ディレクトリ構成例
my_project ├── web # Webシステムで使うシステム外リソース。jsとか画像とか ├── assets # Webシステム以外で使うシステム外リソース。 ├── cmd # mainモジュールを格納 │ ├── mainexe # プロジェクト中の実行ファイル。この単位でbuild │ │ └── main.go │ └── confexe # 別実行ファイル例 │ └── main.go ├── configs # 設定ファイル │ └── main.yaml ├── docs # ドキュメント。自分用なのでメモを突っ込んでる │ └── readme.md ├── internal # 非公開モジュール │ ├── app # このプロジェクト専用のモジュール。ビジネスロジック的な? │ │ ├── mainexe # 実行ファイル別に分ける │ │ │ └ mainview # MVCSでいうService的な感じ? │ │ │ └ mainview.go │ │ └── confexe │ │ └ mainview │ │ └ mainview.go │ └── pkg # 非公開の汎用モジュール │ └ my_lib # なんか使い回すやつ ├── scripts # build時に使うshellなど └── go.mod #Go Moduleで生成されるファイル
Go Modulsの初期化
cd my_project go mod init 192.168.0.0/my_project
・ソースは公開しない
・公開されているモジュールと絶対に被らない
という点で、ホスト名を192.168.0.0とした。
モジュールとして公開しない = go getで取得されることは無いので、ただの文字列以上の意味はない。(と思う)
ホスト名のルールであるピリオド(.)が入っていれば何でもいいはず。
cmd下(mainモジュール)ではなく、全体を含めて初期化する。
mainモジュールからinternal内のモジュールを使う
package main import ( "192.168.0.0/my_project/internal/app/mainexe/mainview" ) func main() { mainview.SomeFunction() }
これで問題なく使えます。