今更ながら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.
変数の中ではname
とdescription
は特別な意味を持っており、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に限らないところがいいですね。