前書き:プロジェクトを新規で作るのはダルい
Golangの勉強中に、「サンプルコードを試すためのプロジェクト」や「検証用プロジェクト」を手動で作るのは、面倒だなと感じてきました。また、どこかのプロジェクトをコピーして流用すると、名称の変更忘れ(誤記、typo)が発生しがちです。
Javaのgradleのような「Golangプロジェクトテンプレートのジェネレータ」を探しましたが、パッと見つかりませんでした。そこで、Golangプロジェクトテンプレートを生成するubumeコマンドを作ってみました。
機能が少ないので、改善案があればIssue(日本語もOK)からご連絡いただけると嬉しいです。
2022年4月19日追記:ubumeからmkgoprjにリネームしました。そして本記事に書かれている内容とは別仕様に変更(破壊的な変更)をしたので、日本語版READMEを参照してください。
インストール方法
go installでインストールしてください。
$ go install github.com/nao1215/mkgoprj/v2@latest
Golang開発環境が未構築の場合は、ubumeコマンドのインストール前にGolang公式サイトを参考にしてGolang開発環境を構築してください。
使い方
前提ですが、Version 0.5.1の段階ではアプリケーションプロジェクトしか生成できません。ライブラリプロジェクトも対応する予定ですが、現在はプロジェクトレイアウトを検討中です。
ubumeコマンドは、"$ go mod init"と同様にインポートパスを引数として取ります。例えば、バージョン管理システム(VCS)にGitHubを使用し、ユーザー名がnao1215であり、新規作製プロジェクト名がsampleの場合は、以下のようにコマンドを実行します。
$ ubume github.com/nao1215/sample
上記のコマンド実行後に生成されるsampleディレクトリ内は、以下のツリー構成となります。
$ tree sample/
sample/
├── Changelog.md
├── Makefile
├── cmd
│ └── sample
│ ├── main.go
│ └── main_test.go
└── go.mod
sample/cmd以下には、mainパッケージとそのテストファイルが格納されています。コードをビルド、テスト、フォーマットするためのMakefileも生成します。" $ go mod init github.com/nao1215/sample" も実行済みの状態です。
Makefileの仕様
Makefileは自己文書化されています。makeコマンドを引数なしで叩いた場合はビルドが始まらず、Makefileがどのようなターゲットを持ち、そのターゲットが何をするのかの説明文(helpメッセージ)が表示されます。
$ make
build Build binary
clean Clean project
deps Dependency resolution for build
fmt Format go source code
test Start test
vet Start go vet
デフォルトで登録されているターゲットは、以下の処理を行います。
- make build:バイナリを生成する
- make clean:プロジェクト内の中間ファイルやゴミを削除する
- make deps:ビルド時に必要な外部ファイルを取得する
- make fmt:コードに対してフォーマッタを適用する
- make test:単体テストを実行し、カバレッジファイル(cover.html)を生成する
- make vet:静的解析を行う
新しいターゲットをMakefileに追加する場合、target:の横に##でコメントを追加してください。その##コメントが抽出されて、helpメッセージとして表示されます。以下、記載例(Makefileの抜粋)です。
build: deps ## Build binary
env GO111MODULE=on GOOS=$(GOOS) $(GO_BUILD) $(GO_LDFLAGS) -o $(APP) cmd/sample/main.go
clean: ## Clean project
-rm -rf ./vendor $(APP) cover.out cover.html
ビルド方法
“make build"でプロジェクトルートディレクトリに、バイナリが生成されます(今回はsampleバイナリが生成されます)。
$ ls
Changelog.md Makefile cmd go.mod
$ make build
$ ls
Changelog.md Makefile cmd go.mod sample
$ ./sample
Hello, World
最後に(追記含む)
類似のプログラムは存在しそうですが、自分好みのプロジェクトがコマンド一発で作れるので、車輪の再発明(?)も悪くないかなと考えています。実装時間も数時間であり、そこまで労力かかっていません(あと、作った次の日に会社で使うタイミングがあった)
以下、追記
2022年2月現在は、オプションが増えて、作れるプロジェクト種類も増えました。本記事の内容も古くなってしまったので、興味がある方はGitHubを覗いてみてください。READMEにスクショ付きで説明を書いています。
