Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

作成したもの


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/

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away