swaggerのfile-mergeだったりgolangのorm自動生成のフォルダ監視にfswatchはいいぞ
Nov 24, 2019 00:38 · 1145 words · 3 minute read
最近、コード自動化を諸々整備している中で、ファイルの変更だったり DB の変更が発生したタイミングで色々コマンドを叩く必要があるんですよね。
これ結構しんどくて、特に swagger とかだと stoplight studio で yaml 修正して、mock サーバの疎通確認するぞって時に、動いてないことに気付いたり。
よくよく確認してみると swagger-merger 実行してないじゃん…みたいなことがよくあります。
こういう時にファイル変更した時にコマンド実行してくれる方法あったらなーと調べたら fswatch がどうやら良さそうなので使ってみました。
swagger の file merge
swagger のファイルの merge コマンド。swagger-merger はこちらを参考ください。
fswatch -0 path/to | xargs -0 -I {} swagger-merger -i path/to/openapi.yaml -o openapi.yaml
解説
fswatch で path/to 配下を watch。その後 xargs で該当のコマンドを実行。
今回は swagger-merger で merge を実行。基本的にはこれだけ。
ちょっと応用してみて golang の ORM 自動生成
fswatch の可能性をかなり感じたため、他にもちょっと試してみました。
golang の ORM で xorm という package があるのですが、この xorm には cli が存在していて 、mysql の table 定義から golang の orm を自動生成してくれる優れものです。
自分は mysql は docker で container を立ち上げて使っているのですが、ここで table の永続化のために data を mount してます。
ここで mount した data は table が作成されるタイミングで作成した table と同名のファイルを作成します。
「あれ?これ fswatch + xorm cli 組み合わせてみたら table 作成したら自動で ORM のコード生成されることないか?」
ということで shell を組んでみました。
まず、xorm の template。
package {{.Models}}
{{$ilen := len .Imports}}
{{if gt $ilen 0}}
import (
{{range .Imports}}"{{.}}"{{end}}
)
{{end}}
{{range .Tables}}
type {{Mapper .Name}} struct {
{{$table := .}}
{{range .ColumnsSeq}}{{$col := $table.GetColumn .}} {{Mapper $col.Name}} {{Type $col}}
{{end}}
}
{{end}}
lang=go
genJson=1
このあたりは xorm においてあるサンプルを参考に template を作成しています。そして以下コマンドをコマンドライン上で実行します。
fswatch -e --event Created --event Updated -e '.*\.ibd$' mysql/data/dbname | xargs -n 1 -I{} basename -s '.frm' {} | xargs -n 1 -I{} xorm reverse mysql "user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8" ./path/to/template path/to/output {}
その後、CREATE TABLE を実行してみます。
package example
import (
"time"
)
type Accounts struct {
Id int64
FirstName string
FirstNameKana string
LastName string
LastNameKana string
Email string
CreatedAt time.Time
UpdatedAt time.Time
}
自動生成されたファイルはこちらです。うまく生成されていますね!
まとめ
ファイル監視を行う fswatch とその周辺の自動化ツールの説明をしていました。
今回紹介した swagger と xorm ですが、swagger は言わずもがな、openapi-generator と組み合わせて自動でソースコードを生成したりとか(api client, model 等)、xorm の cli ツールとかの ORM を自動生成するツールだったりとかでかなり便利なツール群です。
このあたりのコマンド実行を仕組み化するとなるとタスクランナー(grunt, gulp)とかもあるとは思うのですが、自分は shell とか黒い画面でさくっと実行したり、 npm scripts 書いたり、 make 書いた方が楽だと思うので shell は覚えて損ないなと感じました。
このファイル自動生成とか好きだったり興味がある人は是非 fswatch だったりコードの自動化の周辺ツールを試してみてください!面白いですよ。
- 巨人の肩に乗り、SaaSの開発を眺める
- react + react native(Expo)でエラーハンドリングどうやる?
- 黒い画面嫌いにおさらば!gitコマンドを使いこなしてterminalと仲良くなろうや
- Jawsug Yokohama 18 Serverless
- ソースコードリーディングで理解する、AWS X-Ray SDK Go
- [golang]複数のファイルパスから多階層のjson文字列を作成したい
- 【RxSwift】MapKitを使って現在地を表示させる
- golangのif err != nil {}面倒だと言ったな?
- RxSwiftでS3へのアップロードを実装してみる
- go-playground/validatorでエラーField名だけ英語にするのはやめて