LoginSignup
7
1

More than 3 years have passed since last update.

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

Posted at

作成したもの


gogenerとは、テンプレートからGoのプロジェクトを自動生成するCLIツールです!
Chefのtemplateっぽく使えたらと思って作りました。

動作

test


モチベーション

新しく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


スクリーンショット 2020-02-26 8.25.18.png

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

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


ryomak/go-p2pchat

https://github.com/ryomak/go-p2pchat
スクリーンショット 2020-02-22 23.11.52.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に従って、プロジェクトを作成してくれます。

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を例に見てみます。

main.go
package main
import (
    "fmt"
)

func main() {
    fmt.Println("hello [[.AppName]]")
}

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

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

gogenerにテンプレートを追加

gogenerにプルリクを投げます。修正は一行だけです。

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/

7
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
1