今更ながらgiter8を使ってみた

以前playでsalatを使うときにplay-salatを使ったのですが、giter8という名前を見たのはそのときが最初だったと思います。 それからたまに名前を見かけるのですがどういうものか知らずに使っていたので、今更ながらいじってみました。

giter8とは

giter8はgithub上のテンプレートを利用してファイルやディレクトリを生成するコマンドラインツールです。giter8を使うことでsbtプロジェクトなどの作成が楽になります。

macなら導入はhomebrewで簡単にできます。

brew update && brew install giter8

giter8の使い方

以下のようにテンプレート名を指定して、あとは変数部分を対話的に入れていきます。

g8 typesafehub/scala-sbt # sbtプロジェクトの作成

Scala Project Using sbt

organization [org.example]: com.github.akiomik
name [Scala Project]: Sample Project
scala_version [2.10.2]:
version [0.1-SNAPSHOT]:

テンプレート名はgithubのリポジトリ名で、.g8というサフィックスがついています。 以前はg8 --listというオプションでテンプレート一覧を取得できたみたいなんですが、現在はできないようなので以下のwikiから探してくるのが一般的な方法のようです。

https://github.com/n8han/giter8/wiki/giter8-templates

giter8のテンプレート作成

テンプレートの作成も簡単です。 元になるテンプレートがgithub上にあるならそれをforkし修正すればOKです。 元になるテンプレートがない場合は"テンプレートの素"を使って作ります。

以下のように実行するとsample-template-projectというディレクトリが切られ、これがそのままテンプレートとなります。

g8 n8han/giter8

Creates a giter8 project template.

name [My Template Project]: Sample Template Project
giter8_version [0.6.0]:
変数の利用

テンプレートの中でいちばん変更するファイルはsrc/main/g8/default.propertiesです。 変数を追加する場合はこのファイルに列挙します。 =の左が変数名で、右はデフォルト値です。 デフォルトでは下記のようになっています。

name=My Something Project
description=Say something about this template.

変数の中ではnamedescriptionは特別な意味を持っており、nameはテンプレート利用時のディレクトリ名、descriptionはテンプレート利用時の説明文として利用されます。

列挙した変数はファイル名やファイル中で$で囲むことで利用できます。 例えばsrc/main/g8/build.sbt

name := "$name$"

と書くと、nameにSample Projectと入力するとそのまま

name := "Sample Project"

と展開されます。

変数の書式指定

またformatting optionsという変数の展開時に書式指定する機能もあります。 ファイル中で使う場合には

name := "$name;format="lower,hyphen""

などとすると

name := "sample-project"

というように展開してくれます。

またファイル名で利用する場合は

src/main/g8/src/main/scala/$name__Camel$.scala

というように指定すると

src/main/g8/src/main/scala/SampleProject.scala

と展開されます。

formatting optionsは以下が利用可能です。

  • upper
  • lower
  • cap
  • decap
  • start
  • word
  • Camel
  • camel
  • hyphen
  • norm
  • packaged
  • random
テンプレートのテスト

sbtのscriptedを利用したg8-testというsbtコマンドを利用してテストを行うことができます。 src/test/g8/testというファイルにコマンドを記入して期待通り動くことを検証します。 コマンドは以下を参照。

http://www.scala-sbt.org/0.7.7/docs/ChangeDetectionAndTesting.html#Syntax

テンプレート作成のサンプル

サンプルとしてscala-migrationsの空のマイグレーションファイルを作成するテンプレートを作ってみました。g8 akiomik/scala-migrationsで利用できます。

https://github.com/akiomik/scala-migrations.g8

本当はgiter8-scaffoldを使ってscaffoldとして作りたかったんですが、giter8-scaffoldのバグにらしき問題に打ち当たってしまって断念しました……。

感想とか

使ってちょっと気になったのは、pull requestが放置気味なところ。 先のscaffoldの問題に限らず対応してほしいなーというPRが手つかずで残念な気持ちになりました。

とはいえ、テンプレートを使うのも作るのも簡単だし、吐き出すプロジェクトがscalaに限らないところがいいですね。