自分用めも

初心者ちっくなプログラムネタを中心に、自分用の覚え書きをメモっていくための場所です。

ローカル(ソース非公開)プロジェクトで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()
}

これで問題なく使えます。

build

go build -o mainexe cmd/mainexe/*.go

oオプションは出力ファイル名指定。
上記例だとプロジェクトディレクトリ直下に出力される。
pathを含めても良いかも。

個人的にはscriptsディレクトリ内にbuild.shを作成し、
上記コマンドを書いて「./scripts/mainexe_build.sh」で実行してます。

Golangは長いこと放置してたので、本ブログに古い記事もありますがまだ初学者です。
ツッコミありましたらお願いしますm(_ _)m