はじめに
最近はgolangでアプリケーションを書いていてmodel周りにはxoというtoolを使ってmodelファイルを自動生成している
自動生成されるモデル、自動生成用に使うテンプレートファイル、xo自体をどうやって管理運用しているかを残しておく
xo
xoを活用しているリポジトリではdepでvendor配下に利用するライブラリを管理している。そのノリでvendor配下にxoも入れようかと思ったけど、ロジックを実装する上では使う事の無いライブラリとなっている。
という理由からxoはグローバル領域にgetすることにした
自動生成されるファイル、自動生成用のtemplate
これらはgit管理化に置いてcommitしている
こんな感じ
./datasources/mysql
|-- driver.go
|-- driver_test.go
|-- models // xoによって自動生成されたmodelはこのディレクトリに格納
| |-- xxx.xo.go
| |-- xxx.go
| |-- xxx_test.go
| `-- xo_db.xo.go
`-- xo
`-- templates // globalにinstallしたxoのテンプレートファイル一式をここに格納(使っていないDBのtemplateも入れてしまっている)
|-- xxx.go.tpl
xxx.xo.goというのがxoから自動生成されたファイル。(オプションでこのファイル名は変えれる)- これらのファイルには手動で変更を加える事は基本的になし
- 自動生成された
xxx.xo.goのメソッドだけでは事足りない場合がある。その時は同じディレクトリ(=同じpackage内)にxxx.goファイルを追加してメソッドを追加している- ex:他のtableとjoinしてデータを取りたい時とかは自分で追加している
- 自動生成に使うtemplateは随時都合が良いように変更・履歴を残したいのでgit管理下においた
tableスキーマに変更があった場合
xoを使ってxxx.xo.goファイルを再生成してプルリクをつくる
-> xxx.xo.goファイルだけのdiffのプルリクになる
自動生成されるメソッドの形式を変えたかったりする場合
テンプレートファイルを変更し、xoを使ってxxx.xo.goファイルを再生成してプルリクをつくる
-> templateファイルとxxx.xo.goファイルだけのdiffのプルリクになる
ちょっとだけ気になってる事
- 特定のtableだけ対象にしてmodelファイルをgenerateできる用にしたいなーと思っている
- xo自体のレポジトリ内でreleaseタグ運用を入れて欲しい
CONTRIBUTINGファイルを置いて欲しい
最後
自分が担当しているプロジェクトではちょっと合わなかった所は別でまとめるとして下記の所感
- tableに対になるstructの定義とかが自動生成されるのはありがたい。
- 毎回手動でやると間違った型定義しちゃう時あるし、tableスキーマが頻繁に変わるプロジェクトのフェーズだと特にありがたみを感じている
- xoから生成されたメソッドでselectすれば、indexが効いたselectになるので無駄な地雷を踏むことがないので助かってる