始める sbt を以前読んだときは .sbt ビルド定義 のところでぐっと難しくなってよくわからなくなった。 今日復習したのでメモ。
最初にまとめ。
key := value
は新しい設定項目を追加する関数のようなもの(Setting[T]
)を定義する。Setting[T]
の入力は変更されない。.sbt
を読み込むとSetting[T]
のリストができる。Setting[T]
のリストは、依存関係を考慮してソートされた後に適用される。.sbt
の空行で区切られた塊は Scala の式。文ではないのでval
,object
,class
などは書けない。key := value
はkey.:=(value)
といったメソッド呼び出しを別の書き方にしたもの。- sbtデフォルトの設定項目は
sbt.Keys
に定義されている。 TaskKey[T]
は毎回計算されるキー。- sbtコンソールでアクセスするときは
SettingKey[T]
,TaskKey[T]
などを呼び出す際の第一引き数文字列を使う。 - キーの詳細はsbtコンソールから
inspect
で確認できる。
Setting[T]
は、設定を入力に与えると、新しいキーと値のペアを追加したり、既存のキーを新しい値で追加したりといった変換を表す。
変換っていうのは、なにかを入力されたら、それを変更した結果を返すということで、関数みたいな概念で捉えればいいのだろう。
Setting[T]
は関数型の精神に則り、入力値は変更しない。
.sbt
ファイル中の key := value
は変換(Setting[T]
)を定義している。
たとえば name := "hello"
とあれば、キーがname
で値が"hello"
のペアを追加・上書きする変換を定義する。
T
は設定値の型なので、この場合は Setting[String]
が定義されたことになる。
.sbt
ファイルには変換が沢山含まれているので、結果として変換(Setting[T]
)のリストができる。
Setting[T]
のリストに、sbt のデフォルトの設定を入力すると、.sbt
ファイルが反映された設定が得られる。
Setting[T]
が入力値を変更しないのでsbtのデフォルトの設定は変更されない。
.sbt
ファイルで name := "hello"
と書いたら、name.:=("hello")
のこと。
key
の型は SettingKey[String]
で、 :=
は String
を引数にとり Setting[String]
を返す。
間違った型の値を代入しようとした場合には(例:name := 1
)、型チェックでエラーになる。
:=
メソッドの他にも +=
(リストへの要素追加)などがある。
sbtに用意されている設定項目(キー)は
sbt.Keys
object に SettingKey[T]
型で定義されている。
.sbt
ファイルの内容が評価される時は import sbt.Keys._
された状態なので、 sbt.Keys._
はパッケージ修飾なしに参照できる。
sbt.Keys
は重要。
設定項目を探すときにちょくちょく参照することになる気がする。
たとえば name
はこんな感じ。
val name = SettingKey[String]("name", "Project name.", APlusSetting)
前述のようにSettingKey[String]
であることがわかる。
sbt.Keys
には SettingKey[T]
型以外にも、 TaskKey[T]
, InputKey[T]
, AttributeKey[T]
型の値が定義されてる。
compile
のように sbt コンソールから入力するたびに実行してくれないと困るものは
TaskKey[T]
として定義されている。
たとえば compile
はこんな感じ。
val compile = TaskKey[Analysis]("compile", "Compiles sources.", APlusTask)
SettingKey[T]
は一度計算されると結果が保持される。
TaskKey[T]
は毎回計算される。
SettingKey[T]
はTaskKey[T]
に依存できない。
InputKey[T]
, AttributeKey[T]
はまだ知らない。
sbtコンソールから入力するのはキーコンストラクタの第一引き数の文字列。
val scalacOptions = TaskKey[Seq[String]]("scalac-options", "Options for the Scala compiler.")
とあったら scalac-options
がsbtコンソールから入力時に指定する文字列になる。
sbt.Keys
に CamelCase で定義されたものは大体コンソール入力時には小文字、ハイフン区切りになっている。
キーに関する情報はsbtコンソールから inspect キー名
で得られる。
.sbt
ファイルの先頭に import
文を複数行書ける。import
文の間は空行をあけなくていい。
他の SettingKey[T]
を参照するときに使うのかな。