Goのアプリケーションをテンプレートから自動生成するCLIツール

## 作成したもの
<a href="https://github.com/ryomak/gogener"><img src="https://github-link-card.s3.ap-northeast-1.amazonaws.com/ryomak/gogener.png" width="460px"></a>
**gogener**とは、テンプレートからGoのプロジェクトを自動生成するCLIツールです！
Chefのtemplateっぽく使えたらと思って作りました。

## 動作
![test](https://user-images.githubusercontent.com/21288308/70862524-d8b16200-1f80-11ea-812d-8ee6a92a140b.gif)


---

### モチベーション
新しく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
<a href="https://github.com/ryomak/clearn-arch-ex"><img src="https://github-link-card.s3.ap-northeast-1.amazonaws.com/ryomak/clearn-arch-ex.png" width="460px"></a>


クリーンアーキテクチャで作成しています。WebAPIを作成するときは、このパッケージを再利用しています。

--- 

### ryomak/go-deep-util-example
<a href="https://github.com/ryomak/go-deep-util"><img src="https://github-link-card.s3.ap-northeast-1.amazonaws.com/ryomak/go-deep-util.png" width="460px"></a>
[go-deep](https://github.com/patrikeh/go-deep)というディープラーニングするライブラリを利用して、画像分類するプログラムです。
手っ取り早くGoでディープラーニングやってみたい人にオススメです。


---

### ryomak/grpc-vue-go-example 
<a href="https://github.com/ryomak/grpc-clean-arch-vue-go-example"><img src="https://github-link-card.s3.ap-northeast-1.amazonaws.com/ryomak/grpc-clean-arch-vue-go-example.png" width="460px"></a>
<img width="695" alt="スクリーンショット 2020-02-26 8.25.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156450/f0c130c4-f3f0-00c6-96e2-80737cfa43d1.png">

grpcを使ってみたくて、go(clean architecture)の構成でVue.jsのWebサイトを作りました。grpcのexampleで使えます。

GPSを取得して
参加したユーザの位置情報をレーダーのように表示します。
レーダーの実装で力尽きてしまい、見た目がまだまだなのと、部屋の管理がまだ上手くないので、こちら修正も別途していこうと思います。

--- 
### ryomak/go-p2pchat
https://github.com/ryomak/go-p2pchat
<img width="545" alt="スクリーンショット 2020-02-22 23.11.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156450/7cd42c10-05d3-e5f9-7f23-c7fce1fe75fd.png">

これは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に従って、プロジェクトを作成してくれます。

```yaml:app_template.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を例に見てみます。

```go:main.go
package main
import (
    "fmt"
)

func main() {
    fmt.Println("hello [[.AppName]]")
}
```
VueやAngularを含めたプロジェクトのテンプレートだと、```{{}}```で,かぶってしまうので、Delimsを```[[]]```に変更しています。
デフォルトでテンプレートで使えるパラメータは、

- AppName
- ModName
- ToCamel
- ToLowerCamel
が使えます。

--- 

#### gogenerにテンプレートを追加
gogenerにプルリクを投げます。修正は一行だけです。

```go:gogener/interal/recipe/remote/templates.go
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/