Giter8というツールを使うと、
sbtでプロジェクトを開始する時のディレクトリ構成・定義ファイルなどを生成出来ます。
このエントリでは、オリジナルのテンプレート作成の流れを整理します。

Giter8
http://www.foundweekends.org/giter8/index.html

Giter8を使ってみる

オリジナルのテンプレートを作る前に、
既存のテンプレートを使って、プロジェクトを新規作成してみます。

以下のコマンドを入力し、プロジェクト名を指定すると、
指定したプロジェクト名のディレクトリ以下にプロジェクトが作成されます。
# コマンドラインオプションで「–name=」としてもよいです。

$ sbt new sbt/scala-seed.g8
Minimum Scala build.

name [My Something Project]: fuga

Template applied in ./fuga

以下のように、srcやbuild.sbtが作成されていることを確認できます。

$ ls fuga/
build.sbt	project		src

このテンプレートは、以下のgithubのリポジトリで定義されています。
https://github.com/scala/scala-seed.g8

プロジェクトテンプレートを作成する

次にオリジナルのテンプレートを作成していきます。

conscript, Giter8のセットアップ

以下の手順に従って、conscriptをインストールします。

Installing conscript
http://www.foundweekends.org/conscript/setup.html

# このエントリの手順はmacos用なので、Windowsの場合は上記URLに従ってください。

「.bash_profile」に以下を追記し、sourceします。

export CONSCRIPT_HOME="$HOME/.conscript"
export CONSCRIPT_OPTS="-Dfile.encoding=UTF-8"
export PATH=$CONSCRIPT_HOME/bin:$PATH

以下のコマンドで、conscriptをインストールします。

$ wget https://raw.githubusercontent.com/foundweekends/conscript/master/setup.sh -O - | sh

以下のコマンドで、Giter8をインストールします。

$ cs foundweekends/giter8

以下のようにversionが表示できればインストール完了です。

$ g8 --version
g8 0.10.0

プロジェクトテンプレートの作成

以下の手順に従って、テンプレートのひな形を作成します。

Making your own templates
http://www.foundweekends.org/giter8/template.html

以下のコマンドで、テンプレートを生成します。

$ g8 foundweekends/giter8.g8

Creates a Giter8 project template.

name [My Template Project]: My Sample Template
giter8_version [0.10.0]:
sbt_version [0.13.16]:

Template applied in ※作業中のパス※/./my-sample-template

作成したテンプレートのディレクトリには「.g8」のpostfixをつけておきます。
# sbtがGiter8のテンプレートとして認識するために「.g8」のpostfixが必要なようです。

$ mv my-sample-template my-sample-template.g8

作成したテンプレートは、以下のように動作確認できます。
以下は、テンプレートからプロジェクトを生成し、ビルドしている例。

$ sbt new file://`pwd`/my-sample-template.g8 --name=hoge
Template applied in ※作業中のパス※/./hoge
$ cd hoge
$ sbt package

作成したテンプレートを公開する

次に、作成したテンプレートを公開します。

githubに「my-sample-template.g8」というリポジトリを作成し、
その後、前項で作成したプロジェクトをpushします。

githubに公開したテンプレートは、以下のように使用することができます。

$ sbt new ※githubのアカウント名※/my-sample-template.g8 --name=hoge
Template applied in ./hoge

テンプレートをカスタマイズする

ここまでの流れで、生成したひな形のテンプレートを利用できるようになったので、
必要なカスタマイズを行っていきます。

テンプレートへのファイル追加

「src/main/g8」配下にテンプレートが格納されているので、
必要なファイルはここに追加していきます。

思いつきですが、
例えば、プロジェクト開始時によく作成する以下のようなファイルを追加するとか。

  • .gitignore
  • .github/ISSUE_TEMPLATE.md
  • .github/PULL_REQUEST_TEMPLATE.md
  • project/scalastyle.sbt
  • scalastyle-config.xml
  • LICENSE
  • .travis.yml
  • .circleci/config.yml

共通で使うlibraryを「build.sbt」に追加しておくとか。
というような使い方があるのではないかと思います。

変数の置き換え

「src/main/g8/default.properties」で定義されている変数を、
各種テンプレートファイルに展開することができます。

例えば、
build.sbtのnameを、nameの変数で置き換えたい場合は、以下のようになります。
($で括った変数名が展開されます)

src/main/g8/build.sbt

// give the user a nice default project!
lazy val root = (project in file(".")).
  settings(
    inThisBuild(List(
      organization := "com.example",
      scalaVersion := "2.11.8"
    )),
    name := "$name$"
  )

変数の追加

「src/main/g8/default.properties」に変数を追加すると、
sbtでnewする際に、以下のように入力を求められるようになります。

src/main/g8/default.properties

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

sbt newを実行すると、以下のようになります。

$ sbt new file://`pwd`/my-sample-template.g8
Say something about this template.

name [My Something Project]: hoge
username [you]: me

Template applied in ./hoge

以上の流れで、オリジナルのプロジェクトテンプレートを作成できました。

ほぼほぼgithubにpushしておくだけで、テンプレート化出来るので、
プロジェクト開始時にいつも設定している内容やライブラリはテンプレート化しておくと便利だと思います。