sbt 0.13.13 では、テンプレートから新しいビルド定義を作成するための new という新しいコマンドが追加されました。new
コマンドは、テンプレートリゾルバーと呼ばれるメカニズムを介して拡張可能です。
まず、sbt のランチャーバージョン 0.13.13 以降が必要です。通常、sbt
ランチャーの正確なバージョンは、project/build.properties
の sbt.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 は、2010 年に Nathan Hamblen によって開始され、現在は foundweekends プロジェクトによって管理されているテンプレートプロジェクトです。Giter8 のユニークな点は、テンプレートをホストするために GitHub (またはその他の git リポジトリ) を使用することであり、誰でもテンプレートの作成に参加できることです。公式ソースが提供するテンプレートをいくつか紹介します。
詳細については、Giter8 Wiki の Giter8 templates を参照してください。sbt は、Giter8 のテンプレートリゾルバーを同梱することで、Giter8 テンプレートの標準サポートを提供します。
Giter8 パラメータをコマンドの末尾に追加できます。たとえば、特定のブランチを指定するには次を使用できます。
$ sbt new scala/scala-seed.g8 --branch myBranch
新しい Giter8 テンプレートの作成方法の詳細については、独自のテンプレートの作成 を参照してください。
$ sbt new foundweekends/giter8.g8
ソフトウェアテンプレートは、すべての著作権および関連権利を放棄する 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/>.
このページの残りの部分では、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 に公開します。
次に、TemplateResolverInfo
を templateResolverInfos
に追加する 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")
)
}
この間接化により、テンプレートリゾルバーはビルドの残りの部分から独立したクラスパスを持つことができます。