テンプレートの作り方 

テンプレートのライセンスは CC0 1.0 を使う 

ソフトウェアのテンプレートのライセンスには、いわゆる「パブリックドメイン」同様に全ての著作権および隣接する権利を放棄する CC0 1.0 を使用することを推奨する。

日本のようなベルヌ条約締結国に在住する場合、著作権は登録無しでも自動的に発生する。 そのため、テンプレートを公開しても使用ライセンスを明示しない限り他人は使用する法的権利が無いことになる。 ややこしいのは寛容 (permissive) と言われている MIT License や Apache License でも、テンプレートの使用者がテンプレート作者への帰属 (attribution, クレジットに名前を書くこと) を行うことを要請する。 テンプレートに含まれるコードスニペットへの権利を一切放棄するには、国際的なパブリックドメイン相当の CC0 のもとで配布する一択となる。

Template license
----------------
Written in <YEAR> by <AUTHOR NAME> <AUTHOR E-MAIL ADDRESS>
[other author/contributor lines as appropriate]

To the extent possible under law, the author(s) have dedicated all copyright and related
and neighboring rights to this template to the public domain worldwide.
This template is distributed without any warranty. See <http://creativecommons.org/publicdomain/zero/1.0/>.

テンプレートのレイアウト 

Github プロジェクトがあるとき、Giter8 ランタイムは以下の 2つのパスにテンプレートを探しに行く:

src レイアウト 

テンプレートそのものが sbt プロジェクトであることが簡単なので、基本的には src レイアウトが推奨される。 この方法を使うと sbt プラグインを使ってローカル環境でテンプレートをテストしてから Github に push することが可能になる。

新しいテンプレートプロジェクトを始める簡単な方法はそれ専用の Giter8 テンプレートを使うことだ:

$ g8 foundweekends/giter8.g8

これは src/main/g8 内に仮のソースが入った sbt プロジェクトが作られる。 default.properties という Java プロパティファイルがテンプレートのフィールドとそのデフォルト値を定義する。

default.properties 

この default.propertiesproject/ ディレクトリ下、もしくはテンプレートのルートにに置くことが可能だ。 プロパティは簡単なキーとそれを置換する値のペアから成り立っている。

Giter8 テンプレートに実際の適用を行うのは Scalasti でラッピングされた StringTemplate で、 ソースファイル内のテンプレートフィールドは $ で囲んで書かれる。具体例で説明すると、classname というフィールドはソース内では

class $classname$ {

といったふうに表記される。

このテンプレートフィールドは他のフィールドのデフォルト値を定義するのにも使うことができる。 例えば、ユーザの Github id を使って URL を作ることが可能だ:

name = URL Builder
github_id=githubber
developer_url=https://github.com/$github_id$
project_url=https://github.com/$github_id$/$name;format="norm"$

インタラクティブモードでは以下のようなプロンプトになる:

name [URL Builder]: my-proj
github_id [githubber]: n8han
project_url [https://github.com/n8han/my-proj]:
developer_url [https://github.com/n8han]:

name フィールド 

もし定義されていれば、name フィールドは Giter8 に特殊扱いされるフィールドだ。 これはプロジェクト名に使われることが決められていて、g8 ランタイムはこの名前を用いてテンプレートがアウトプットされるディレクトリを作成する (ただし、空白文字と大文字は置換される)。 name フィールドがテンプレートに指定されなければ、g8 はユーザのカレントディレクトリにアウトプットする。 いずれの場合もテンプレートのソースディレクトリ内に入れ子のディレクトリはアウトプットディレクトリ内にも複製される。 また、ファイル名やディレクトリ名もテンプレート展開の対象となる。例えば:

src/main/g8/src/main/scala/$classname$.scala

package フィールド 

package フィールドは、もし定義されていれば、ユーザのソースのパッケージ名となることが決められている。 $package$ と名前のついたディレクトリはパッケージディレクトリ構造に展開される。 例えば、net.databindernet/databinder となる。

verbatim フィールド 

verbatim フィールドは、もし定義されていれば、空文字で区切られたファイルパターンのリスト (例えば *.html *.js) だと決定されている。 verbatim パターンにマッチするファイルは String Template 処理から除外される。

Maven プロパティ 

Maven プロパティ を使って Central Maven Repository をクエリすることができる。 特定のバージョンを書く (そしてリリース毎にテンプレートを更新する) 代わりにライブラリ名だけを書いて Giter8 が最新のバージョンを Maven Central から探して設定するという方法がある。

このプロパティの記法は maven(groupId, artifactId) だ。 ここで注意するべきなのは Scala プロジェクトは多くの場合 Scala バージョンが artifact id に入る形で公開されていることだ。 そのため、例えば最新の Unfiltered ライブラリを指定するには以下のように書く必要がある:

name = My Template Project
description = Creates a giter8 project template.
unfiltered_version = maven(ws.unfiltered, unfiltered_2.11)

root レイアウト 

実験的レイアウトとして root レイアウトというのがあって、これは Github プロジェクトのルートディレクトリをテンプレートのルートとして用いる。

ただし、この方法だと project 内にテンプレートフィールドを使うことができなくなるので適用範囲は非常に限られている。 sbt ビルドでは無いテンプレートやフィールドを一切持たないテンプレートには有用かもしれない。