giter8 テンプレートの作り方

n8han/giter8 · GitHub

前提

このエントリは giter8 の使いかたについては知っている前提です。

やっておく

giter8をアップデートしましょう。
verbatimとかの機能が最近追加されてます。

 $ cs n8han/giter8

ディレクトリ構成

src/main/g8 の中にテンプレート化したいプロジェクトをぶっこみます。


参考: tototoshi/scalatra-bootstrap.g8 · GitHub

src
└── main
    └── g8
        ├── build.sbt
        ├── default.properties 
        └── src
            └── main
                 ├── resources
                 └── scala
                    └── $package$
                          ├── $servlet_class_name$.scala
                          └── InitializationListener.scala

$foo$

$ で囲まれた文字列、及びファイル名はg8コマンドでとってくるときに置換されます。
また $package$ についてはそれ以下を典型的なディレクトリ構成にしてくれます。
例えば $package$ をcom.github.tototoshi にすると com/github/tototoshi っていうディレクトリを切ってくれます。


↓こんなかんじ

package $package$

import org.scalatra.ScalatraServlet
import org.scalatra.scalate.ScalateSupport

class $servlet_class_name$ extends ScalatraServlet with ScalateSupport {

  get("/") {
    contentType = "text/html"

    layoutTemplate("index.ssp", "message" -> "Hello, World!")
  }

}

default.properties

置換する文字のデフォルトは default.properties に設定します。


例えば default.properties に

package=com.example
servlet_class_name=ExampleServlet

と書けば、


g8 コマンド実行時、

package [com.example]:
servlet_class_name [ExampleServlet]:

と聞いてくるようになります。
そのまま Enter すると package は com.example, servlet_class_name は ExampleServlet になります。

$のエスケープ

giter8 の使っているテンプレートエンジンは $ を特殊文字とみなすので、
ソースコード中に $ が含まれていると期待通りの動作をしてくれません。
$ を使いたいときはバックスラッシュでエスケープしましょう。

verbatim

とはいえ、たとえば jQuery つかった JavaScript の $ とかをいちいちエスケープするのはちょっとあれなので、
verbatim という機能を使います。

default.propertiesに

verbatim=*.js *.css

のように指定すれば *.js, *.css は文字列置換の対象になりません。
これは最近入ったみたいですね。g8.ignore · Issue #21 · n8han/giter8 · GitHub で議論されて追加されてます。
eed3si9n(読めない)さんありがとう!

testする

テストの方法は2通りあります。

  1. とりあえずgithubにpushればいいじゃない
  2. giter8-pluginを使う

一つ目は置いといて、2つ目の giter8-plugin は手元で動作確認するための sbt-plugin です。
詳しくは n8han/giter8 · GitHub の Readme: Using the giter8-plugin のとこ読んでください。
インストールすると sbt に g8-test コマンドが追加されます。

branchを使う

giter8 は git を使っているので、branch を使うと派生テンプレートみたいなのを作るのが楽です。
例えば
sbt-0.11.g8 っていうテンプレートを作ったら、 web project 用のテンプレートをそのブランチにしたりとか便利じゃないかなあ


以上。