go version go1.15.2
Go言語コミュニティの推奨ディレクトリ構成に従い、標準のパッケージ管理システムである「Go Modules」を使おうとして微妙にハマった。
自サイトに同じ記事をメモとして書いたが、ツッコミが欲しくなったのてQiitaにも投下しておく。
ディレクトリ構成例
エクスクラメーションマーク(!)が付いている名前(及び下位要素)は、任意の識別子です。
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モジュールからinternal内のモジュールを使う
package main
import (
"192.168.0.0/my_project/internal/app/mainexe/mainview"
)
func main() {
mainview.SomeFunction()
}
これで問題なく使えます。
build
go build -o mainexe cmd/mainexe/*.go
oオプションは出力ファイル名指定。
上記例だとプロジェクトディレクトリ直下に出力される。
distとか適当にディレクトリを作って、出力先pathとして含めても良いかも。
個人的にはscriptsディレクトリ内にbuild.shを作成し、
上記コマンドを書いて「./scripts/mainexe_build.sh」で実行してます。
Golangは長いこと放置してたので、古い記事もありますがまだ初学者です。
ツッコミありましたらお願いしますm(_ _)m