1. sbt new とテンプレート

sbt new とテンプレート 

sbt 0.13.13 では、テンプレートから新しいビルド定義を作成するための new という新しいコマンドが追加されました。new コマンドは、テンプレートリゾルバーと呼ばれるメカニズムを介して拡張可能です。

new コマンドを試す 

まず、sbt のランチャーバージョン 0.13.13 以降が必要です。通常、sbt ランチャーの正確なバージョンは、project/build.propertiessbt.version で指定されたバージョンを使用するため、問題にはなりません。ただし、新しい sbt のランチャー 0.13.13 以降は、project/build.properties が存在しない場合でもコマンドが機能するために必要です。

次に、次を実行します。

$ sbt new scala/scala-seed.g8
....
name [hello]:

Template applied in ./hello

これにより、scala/scala-seed.g8 テンプレートが Giter8 を使用して実行され、「name」の値の入力を求められ(デフォルト値は「hello」で、[Enter] を押して受け入れました)、./hello の下にビルドが作成されました。

scala-seed は「最小」の Scala プロジェクトの公式テンプレートですが、間違いなく唯一のものではありません。

Giter8 のサポート 

Giter8 は、2010 年に Nathan Hamblen によって開始され、現在は foundweekends プロジェクトによって管理されているテンプレートプロジェクトです。Giter8 のユニークな点は、テンプレートをホストするために GitHub (またはその他の git リポジトリ) を使用することであり、誰でもテンプレートの作成に参加できることです。公式ソースが提供するテンプレートをいくつか紹介します。

詳細については、Giter8 Wiki の Giter8 templates を参照してください。sbt は、Giter8 のテンプレートリゾルバーを同梱することで、Giter8 テンプレートの標準サポートを提供します。

Giter8 パラメータ 

Giter8 パラメータをコマンドの末尾に追加できます。たとえば、特定のブランチを指定するには次を使用できます。

$ sbt new scala/scala-seed.g8 --branch myBranch

Giter8 テンプレートを作成する方法 

新しい Giter8 テンプレートの作成方法の詳細については、独自のテンプレートの作成 を参照してください。

$ sbt new foundweekends/giter8.g8

テンプレートライセンスには CC0 1.0 を使用してください 

ソフトウェアテンプレートは、すべての著作権および関連権利を放棄する CC0 1.0 の下でライセンスすることを推奨します。これは「パブリックドメイン」に似ています。

米国などのベルヌ条約の対象となる国にお住まいの場合は、登録なしに著作権が自動的に発生します。したがって、ライセンス条件を宣言しないと、ユーザーはテンプレートを使用する法的権利を持ちません。難しいのは、MIT ライセンスや Apache ライセンスなどの寛容なライセンスでさえ、テンプレートユーザーのソフトウェアでテンプレートへの帰属を要求することです。テンプレート化されたスニペットに対するすべてのクレームを削除するには、パブリックドメインの国際的な同等物である CC0 の下で配布します。

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 software to the public domain worldwide. This software is distributed without any warranty.
You should have received a copy of the CC0 Public Domain Dedication along with this software. If not, see <https://creativecommons.org/publicdomain/zero/1.0/>.

sbt new を拡張する方法 

このページの残りの部分では、Giter8 テンプレート以外のものをサポートするために sbt new コマンドを拡張する方法について説明します。new の拡張に興味がない場合は、このセクションをスキップできます。

テンプレートリゾルバー 

テンプレートリゾルバーは、sbt new の後の引数を調べて、特定のテンプレートに解決できるかどうかを判断する部分関数です。これは、resolvers がインターネットから ModuleID を解決するのに似ています。

Giter8TemplateResolver は、ハイフン (-) で始まらない最初の引数を取り、それが GitHub リポジトリまたは ".g8" で終わる git リポジトリのように見えるかどうかを確認します。いずれかのパターンに一致する場合、Giter8 に引数を渡して処理します。

独自のテンプレートリゾルバーを作成するには、依存関係として template-resolver を持つライブラリを作成します。

val templateResolverApi = "org.scala-sbt" % "template-resolver" % "0.1"

そして、次のように定義されている TemplateResolver を拡張します。

package sbt.template;

/** A way of specifying template resolver.
 */
public interface TemplateResolver {
  /** Returns true if this resolver can resolve the given argument.
   */
  public boolean isDefined(String[] arguments);
  /** Resolve the given argument and run the template.
   */
  public void run(String[] arguments);
}

ライブラリを sbt コミュニティリポジトリまたは Maven Central に公開します。

templateResolverInfos 

次に、TemplateResolverInfotemplateResolverInfos に追加する sbt プラグインを作成します。

import Def.Setting
import Keys._

/** An experimental plugin that adds the ability for Giter8 templates to be resolved
 */
object Giter8TemplatePlugin extends AutoPlugin {
  override def requires = CorePlugin
  override def trigger = allRequirements

  override lazy val globalSettings: Seq[Setting[_]] =
    Seq(
      templateResolverInfos +=
        TemplateResolverInfo(ModuleID("org.scala-sbt.sbt-giter8-resolver", "sbt-giter8-resolver", "0.1.0") cross CrossVersion.binary,
          "sbtgiter8resolver.Giter8TemplateResolver")
    )
}

この間接化により、テンプレートリゾルバーはビルドの残りの部分から独立したクラスパスを持つことができます。