一気に作りあげようとしたのだけれど、結構面倒な問題に遭遇したので、一旦自分の考えをメモしてみるだけのなにか。
アドバイス募集。
追記:
seratch さんからコメントもらったので参照するといいよ
続き書いたよ squeryl2scalikejdbc作り始めた
最終目的
- squeryl2scalikejdbcというsbtpluginつくる
- 一番シンプルな使い方としては
- sbt consoleからorg.squeryl.Schemaを継承したクラスの名前を指定
- すべてのモデルのscalikejdbc用のmapperのコードを生成
- 色々モデル毎に生成するメソッドを細かく制御できるようにする
前提条件とか詳しいモチベーションなど
- すでにSqueryl使ってて、モデルのcase classの定義は存在してる
- squerylとscalikejdbcを併用していきたいが、scalikejdbc用のmapperを全部手で書くの面倒だし、ミス発生しそう
- scalikejdbc-mapper-generatorは現状のversion 1.5.1 ではデータベースから情報を取得きて、それを元にコード生成する
- 「squerylを使ったモデルのcase class(を変更したりする) → databaseにcreate tableとかalter table発行 → scalikejdbc用のmapperを生成」という手順は、不可能ではない
- が、データベース介さずにsquerylが保持しているメタ情報から直接コード生成したい
- 介したくないというか、そもそもすでにcase classが存在するので、(データベースのカラム名はmappingできても)case classのfield名が、必ずしもカラム名をCamelCaseにしたものとは限らないので、「squerylが保持しているメタ情報から生成」のほうが明らかに望ましい
- なんとなく試したらある程度できたので可能なはず(Enumerationなどは難しいけど) https://gist.github.com/xuwei-k/5277254
- 単にscalikejdbc-mapper-generatorを使うと、必要ない部分が多いという理由もあるので、生成されるコードを色々カスタマイズもしたい
- scalikejdbc-mapper-generatorはsbt pluginなので2.9.2でビルドされてる
- 使いたいプロジェクトのScalaのversionは2.10である
- なので、scalikejdbc-mapper-generatorをlibraryDependencyに加えられない
で、その回避策として、迷ってる案が現在2つあって
scalikejdbc-mapper-generatorのSbtKeys.scalaとSbtPlugin.scala
https://github.com/seratch/scalikejdbc/blob/1.5.1/scalikejdbc-mapper-generator/src/main/scala/scalikejdbc/mapper/SbtPlugin.scala
https://github.com/seratch/scalikejdbc/blob/1.5.1/scalikejdbc-mapper-generator/src/main/scala/scalikejdbc/mapper/SbtKeys.scala
以外のほとんどの部分をコピペしてきて、改変しつつ、独自に(マルチプロジェクトの)plugin作る。マルチプロジェクトというのは、
- squeryl2scalikejdbc-core (Scala2.10で作る。これ自体はsbt-pluginではない。scalikejdbc-mapper-generatorからコピペしてきたものと、その他少しだけ自分で書いたもの)
- squeryl2scalikejdbc-plugin (sbt-pluginとしてScala2.9で作る。squeryl2scalikejdbc-coreを呼び出すTaskなどを定義するだけのもの)
という感じになるはず
もう一つの案は、
scalikejdbc-mapper-generatorには依存しつつ、scala2.9とscala2.10のデータを受け渡す部分をJavaで書く or 一旦何らかの汎用的な*1フォーマットでファイルに書き出して受け渡す