Scala入門記013 sbt newテンプレート

こんにちは。
珍しく短い間隔でBlogを書いてます。
まだ海には行けていないくらいです。

前回はsbt newについて書きましたが、Myテンプレートを持つのが良さそう、と書きました。
Myテンプレートを持つためにはまずは簡単なテンプレートの作り方を覚えてそれを成長させていくのが良いと思います。
ということで、最もシンプルなテンプレートを作ってみました。
Scala入門記の目次はこちらです。

テンプレートの作り方

Giter8のドキュメントを見るとわかりやすいです。
Giter8 — テンプレートの作り方


今回作るテンプレート

テンプレートの名前は.g8のサフィックスが必要なので、今回はscala-helloworld.g8と名前をつけます。
このテンプレートでは
Scala入門記006 sbt + ScalaTest - うさばかSE Blog3
で紹介したプロジェクトを生成できるようになります。


ルール

詳しくはドキュメント読めばいいので最低限と思われるものを紹介します。

ライセンス

ドキュメントでCC0を使えと言われているのでREADME.mdで示してみました。

ファイルの配置場所

Giter8のファイルはsrc/main/g8に配置するのが良いです。
こうすることでローカルでテンプレートをテストできるようになります。

プロジェクトフィールド

プロジェクトを生成する際にパラメータを指定可能にするプロジェクトフィールドと言う仕組みがあります。
パラメータはdefault.propertiesに書くと、テンプレート内で$name$という形で使えるようになります。
パッケージ名はディレクトリ階層にいい感じで変わってくれたりもしてすごく便利です。

他にもCamelCaseなどに置き換えたい場合もかんたんに指定できるようになっています。
詳しくはこちらのドキュメントを見ると困ることはないでしょう。
Giter8 — テンプレートフィールドのフォーマット


生成ファイル

今回はsbtプロジェクトを生成するので、build.sbtにビルド定義、src/main/scalaソースコード、src/test/scalaにテストコードを格納することになります。


テンプレートを作る

今回はシンプルに以下の構成でファイルを作りました。

scala-helloworld.g8/README.md
scala-helloworld.g8/src/main/g8/build.sbt
scala-helloworld.g8/src/main/g8/default.properties
scala-helloworld.g8/src/main/g8/src/main/scala/$package$/$classname$.scala
scala-helloworld.g8/src/main/g8/src/test/scala/$package$/$classname$Spec.scala


各ファイル内容は載せると冗長なのでこちらをご確認ください。
github.com


ローカルでテスト

テンプレートができたらgithubなどにpushする前に正しく動作するかテストできます。
これはsrc/main/g8にテンプレートを作った場合の特権です。

テスト

sbt-helloworld.g8のあるフォルダで以下のコマンドを呼べばテストできます。

sbt new file://scala-helloworld.g8

うまくいかない場合はフルパスで書くと良いです。

sbt new file:///path/to/scala-helloworld.g8


今回のテンプレートであれば以下のようにプロジェクトの情報を聞かれます。

name [Scala HelloWorld]:
classname [Greeting]:
package [com.example]:
scalaVersion [2.12.2]:
applicationVersion [0.1.0-SNAPSHOT]:

とりあえずEnter連打で試して動作確認し、全部変えてみて試す感じが良いと思います。


今回のプロジェクトはmainクラスとScalaTestのSpecが出力されるので、生成されたプロジェクトに入って

sbt test

でテストが通ることを確認し、

sbt run

で動作確認ができます。

このあたりの詳細は
Scala入門記006 sbt + ScalaTest - うさばかSE Blog3
をご確認ください。


リポジトリにPush

動作が確認できればGitHubなどにPushします。

GitHubにPush

GitHubに公開した場合は以下のようにユーザ名とリポジトリ名でテンプレートを指定できます。

sbt new thachi/scala-helloworld.g8

BitbucketにPush

GitHub以外はリポジトリをフルパスで指定することで利用できます。

今回はBitbucketで試しましたが、Bitbuketのリポジトリ
HTTPS

https://bitbucket.org/thachi/scala-helloworld.g8.git

SSH

git@bitbucket.org:thachi/scala-helloworld.g8.git

です。


sbt newで指定する場合は最後の.gitは省いて

sbt new https://bitbucket.org/thachi/scala-helloworld.g8

sbt new git@bitbucket.org:thachi/scala-helloworld.g8

とすることで指定ができます。


Bitbucketは無料で非公開なリポジトリも作れるので、公開しないライブラリを使う場合はこちらにテンプレートを置くと便利ですね。


まとめ

sbt newのテンプレートはgiter8のテンプレートを作ればそれが使えます。
src/main/g8にファイルを作り、プロジェクトフィールドを駆使して思い通りのプロジェクトが生成できるようにテンプレートを作ります。
そして、テンプレートができたらローカルでテストして動作確認し、最後にGitHubやBitbucketなどのgitリポジトリにPushして、利用可能にします。


今回は簡単なテンプレートを作りましたが要点は押さえていると思います。
みなさんも、Myテンプレートで素敵なsbt newライフを始めてみてはいかがでしょうか。
Scala入門記の目次はこちらです。