Locked History Actions

sbt/Getting-Started-Custom-Settings

カスタム設定とタスク

https://github.com/harrah/xsbt/wiki/Getting-Started-Custom-Settingsの訳(2011/10/30時点)

ここでは、君自身が設定とタスクを作成できるようにする。 このガイドの以前のページ、特にbuild.sbtとmore about settingsについて読んだことが前提だ。

キーを定義する

Keys

  • is packed with examples illustrating how to define keys. Most of the keys are implemented in デフォルト.

キーは三つの中の一つのタイプを持つ。 SettingKeyTaskKeyについては.sbt build definitionで説明した。 InputKeyについては「Input Tasks」ページを参照のこと。

Keysの中から例を示す。 Some examples from Keys:

val scalaVersion = SettingKey[String]("scala-version", "The version of Scala used for building.")
val clean = TaskKey[Unit]("clean", "Deletes files produced by the build, such as generated sources, compiled classes, and task caches.")

Keyのコンストラクタは二つの文字列パラメータを持つ、キーの名前("scala-version")とドキュメント文字列だ ("The version of scala used for building.").

「.sbt build definition」を思い起こそう、SettingKey[T]のタイプパラメータTはsettingが持つ値のタイプを示している。TaskKey[T]のTはタスクの「結果」タイプを示している。 「.sbt build definition」では、settingが固定的な値を持ち、プロジェクトreloadされるまでは変更されないが、これに対して、タスクはタスク実行のたびに再計算されることを説明した(つまり、sbt対話モードやバッチモードで誰かがコマンドを入力するたび)。

キーは.scalaファイル中で定義できる(「.scala build definition」で説明した)、あるいはプラグイン中でも定義できる(「using plugins」で説明したように)。 .scalaファイルのBuildオブジェクト中にあるvalも、プラグインのPluginオブジェクト中にあるvalも、自動的に.sbtファイルにインポートされる。

タスクの実装

キーを定義したなら、それを何らかのタスク中で使う必要がある。 君自身のタスク中で使っても良いし、既存のタスクを再定義してもよい。 いずれにしても同じだ。もしタスクが他のsettingやタスクへの依存を持たないなら、 タスクキーにコードを結びつけるのに「:=」を使う。

sampleStringTask := System.getProperty("user.home")

sampleIntTask := {
  val sum = 1 + 2
  println("sum: " + sum)
  sum
}

タスクが何らかの依存を持つなら、当然<<=を使う。「more about settings」で説明したようにね。

タスクの実装で最も難しい部分は、sbt特有の事柄では無いことが多い。 タスクは単なるScalaプログラムなのだ。 難しい部分は、君が何をしようとしているかという、その「肉」の部分を記述することだ。 例えば、HTMLをフォーマットしたいとするなら、HTMLのライブラリが必要になるよね。 (たぶん、ビルド定義にライブラリ依存を記述して、そのHTMLライブラリに基づくコードを書くよね)。

sbtは、君がファイルやディレクトリのIO操作によく使うAPIと同様の、便利な関数をユーティリティライブラリとして持っている。

タスクを拡張するが、置換はしない

もし既存のタスクをそのまま実行させて、何らかのアクションを付け加えたいのであれば、 既存のタスクを入力として~=や<<=を使うのがいい(そのタスクの実行を含意している)。 以前の実装の実行が終了した後で、君がしたいことをする。

// 次の二つは等価だ
intTask <<= intTask map { (value: Int) => value + 1 }
intTask ~= { (value: Int) => value + 1 }

プラグインを使う!

もし、.scalaファイル中にたくさんのカスタムコードが必要になるようなら、 それを複数のプロジェクトで利用できるようにプラグイン化することを考えよう。

プラグインを書くのは非常に簡単だ、以前に説明したように。

このページは非常に簡単に説明している。カスタムタスクについてはタスクを参照してほしい

次はサマリ