作成したもの
gogenerとは、テンプレートからGoのプロジェクトを自動生成するCLIツールです!
Chefのtemplateっぽく使えたらと思って作りました。
動作
モチベーション
新しくWebのAPIを作成する時に、
一から書くと時間かかって面倒臭いので、
テンプレートだけ作っておいて、いつでもプロジェクトを使えるようにしようとました
どんなテンプレートがあるの?
テンプレートの取得には、gogener自身が持っているテンプレートと、外部に設置しているテンプレートがあります。
今のところ、
local
- ryomak-app(ddd + clean architecture構成のWebAPI)
reomte
- ryomak/go-deep-util-example (GoでDeepLearningするexample)
- ryomak/grpc-vue-go-example (I/Fがgrpcで作成したGoとvueのWebサイト)
- ryomak/go-p2pchat (P2P型のgoのチャットCLIツール)
があります。
ryomak-app
クリーンアーキテクチャで作成しています。WebAPIを作成するときは、このパッケージを再利用しています。
ryomak/go-deep-util-example
go-deepというディープラーニングするライブラリを利用して、画像分類するプログラムです。
手っ取り早くGoでディープラーニングやってみたい人にオススメです。
ryomak/grpc-vue-go-example
grpcを使ってみたくて、go(clean architecture)の構成でVue.jsのWebサイトを作りました。grpcのexampleで使えます。
GPSを取得して
参加したユーザの位置情報をレーダーのように表示します。
レーダーの実装で力尽きてしまい、見た目がまだまだなのと、部屋の管理がまだ上手くないので、こちら修正も別途していこうと思います。
ryomak/go-p2pchat
https://github.com/ryomak/go-p2pchat
これはP2P型のチャットCLIです。
一度一つのノードに接続すれば、ブロックチェーンのように、他の接続ノードへ伝搬します。
gogenerの使い方
$ go get github.com/ryomak/gogener/cmd/gogener
$ gogener create -app (アプリ名) -mod (module名) ryomak-app
最後に
今回は初めてガッツリCLIを作ってみました。
Go言語はCLIが作りやすくていいですね。
それぞれのテンプレートの元になったプロジェクトの修正等あれば、プルリクお願いしますmm
余談
テンプレートはGithubPagesで公開すれば、CLIツールで使えるようになります。是非作ってプルリク投げて欲しいです。
方法は、https://ryomak.github.io/gogener/
にまとめていますが、例で説明します。
プロジェクトを作成
基本的には生成するアプリと同じディレクトリ構成でテンプレートを配置します。配置するテンプレートはyamlファイルで記述しておきます。このファイルをgogenerに登録しておくと、このyamlに従って、プロジェクトを作成してくれます。
name: "ryomak/go-p2pchat"
bg-file-path: "bg.txt"
templates:
- "go.mod"
- "util/userInput.go"
- "util/util.go"
- "Makefile"
- "peer/util.go"
- "peer/peer.go"
- "README.md"
- "chat.go"
- "control/control.go"
- "app_template.yaml"
テンプレートを生成
main.goを例に見てみます。
package main
import (
"fmt"
)
func main() {
fmt.Println("hello [[.AppName]]")
}
VueやAngularを含めたプロジェクトのテンプレートだと、{{}}
で,かぶってしまうので、Delimsを[[]]
に変更しています。
デフォルトでテンプレートで使えるパラメータは、
- AppName
- ModName
- ToCamel
- ToLowerCamel
が使えます。
gogenerにテンプレートを追加
gogenerにプルリクを投げます。修正は一行だけです。
var remoteMap = map[string]string{
"go-deep-util-example": "https://ryomak.github.io/templates-for-gogener/go-deep-util/app_template.yaml",
"grpc-vue-go-example": "https://ryomak.github.io/templates-for-gogener/grpc-vue-example/app_template.yaml",
+ "exapp": "{github pages url}/app_template.yaml"
}
これで以上です。
最後に
今回、初めてしっかりしたCLIを作ってみました。
すぐにAPPを作成したい時は、使えると思います。
個人的な学びとしては、CLI作成において、Github Actionで、CLIのリリースまで行いました。普段はCircleCIを用いていたのですが、GithubActionが便利で、乗り換えて行こうと思いました。
CLIのリリースにはgorelaserが簡単でした!下の記事をみたらすぐできます!
https://tellme.tokyo/post/2020/02/04/release-go-cli-tool/