sbtノート4.sbt構築定義

5152 ワード

.sbt vs .scala
sbt構築定義には、プロジェクトルートディレクトリのsbtファイルとprojectサブディレクトリのscalaファイルが含まれます. 
一つだけでもいいし、両方使ってもいいです.1つの比較的良い方法は:大部分は.sbtで定義する場合.sbtは処理できないから、使います.scala、例えば:
カスタムsbt(新しい設定とタスクを追加)
ネストされたアイテムの定義(サブモジュール)
ここでは議論するだけだ.sbt.
コンストラクション定義とは
** PLEASE READ THIS SECTION ** 
プロジェクトをチェックし、コンストラクション定義ファイルを処理した後、sbtは最終的に、コンストラクションを可変マッピング(キー値ペアのセット)で記述する. 
たとえば、プロジェクト名のキー名はnameで、文字列の値にマッピングされます. 
コンストラクション定義ファイルは直接ではありません(すぐにですか?)sbtのマッピングに影響します. 
(Build definition files do not affect sbt's map directly.) 
逆に、コンストラクション定義は巨大なSettings[T]オブジェクトリストを作成します(Tはmapの値のタイプです).Settingはmapへの変換を記述し、例えば新しいキー値ペアを追加したり、既存の値を追加したりする.(関数プログラミングの精神に基づいて、古いマッピングを更新するのではなく、新しいマッピングを返します)
在build.sbtでは、次のようにしてSetting[String]を作成してプロジェクト名を表します.
name := "hello"

このSettings[String]は、マッピング内のnameキーを「hello」に関連付ける(追加または置換).変換されたマッピングを新しいsbtマッピングとして使用します. 
マッピングを作成するために、sbtはまずsettingsリストをソートして、同じキー名に対する変更をまとめ、値が他のキーに依存する場合、依存キーの後に処理します.次にsbtは,順序付けされたSettingsリストを用いてマッピングに順次適用する. 
まとめ:構築定義は、sbtマッピングキー値ペアに影響を与える変換であり、Tは価値のあるタイプであるSetting[T]リストを定義します.
build.sbt settingsの定義方法
build.sbtはSeq[Setting[]]を定義する.これはScala式のリストで、空白の行間隔で、各行はシーケンスの要素です.もしsbtファイルの先頭に「Seq(」と書き、末尾に「)」(引用符を含まない)と書き、空白行をカンマに置き換えると等価に見える.scalaコード. 
例:
name := "hello"

version := "1.0"

scalaVersion := "2.9.2"

build.sbtの式は互いに独立しており、完全なscala文ではなく式である.在build.sbtでは、トップレベルのval、object、class、メソッドは定義できません. 
上記の例では、=左はキーであり、キーはSettingKey[T]、TaskKey[T]またはInputKey[T]タイプのインスタンスでなければならず、Tは予想値のタイプを表す. 
Keysには、Java構文スタイルでこのメソッドを呼び出すことができるSetting[T]を返す=メソッドがあります.
name.:=("hello")

Scalaではname:=「hello」で代用(Javaスタイルはブス…) 
nameこのキーの:=メソッドはSetting[String]を返し、nameキー自体のタイプはSettingKey[String]である.この例では、戻り値Settings[String]は、sbtマッピングのnameキーの値を「hello」(追加または置換)に設定する変換です. 
値のタイプが間違っている場合、コンストラクション定義はコンパイルできません.
scala name := 42  // will not compile ### Settings are separated by blank lines

このように書くことはできません.
//     ,    
name := "hello"
version := "1.0"
scalaVersion := "2.9.2"

sbtは、式がどこで終わるか、次がどこで始まるかを示すために、あるデリミタが必要です.
.sbtファイルには、完全なScalaプログラムではないScala式のリストが含まれています.これらの式は、まず分割され、コンパイラに1つずつ渡さなければなりません.
完全なScalaプログラムがほしいなら、使ってください.scalaファイル;sbtファイルはオプションです.
キーをKeysオブジェクトで定義
内蔵キーはすべてKeysオブジェクトのフィールドです.build.sbtはsbtを暗黙的に導入する.Keys._.だからsbt.Keys.nameはnameと書くことができます. 
カスタムキーは.scalaファイルまたはプラグインで定義します.
settingsの別の方法を変更します
:=は最も簡単な変換です.他にも方法があります.たとえば、+=でリスト値にコンテンツを追加できます.
他の変換にはscopesの知識が必要なので、後で紹介します.
タスクキー
3つの風味のキーがあります:(赤焼き、蒸し焼き、揚げ物もあります)
SettingKey[T]:値が1つあり、計算は1回のみ(プロジェクトのロード時に1回のみ計算され、常に存在します). 
TaskKey[T]:値があり、毎回再計算され、副作用が発生する可能性があります. 
InputKey[T]:入力としてコマンドラインパラメータを持つタスクキーです.InputKeyについては、入門ガイドには記載されていません.
TaskKey[T]は、compileやpackageのような操作がタスクであるタスクを定義します.タスクはUnit(Scalaのvoid)を返すか、packageがTaskKey[File]であり、その値が作成したjarファイルであるなど、タスクに関連付けられた値を返すことができます.
インタラクティブなsbtプロンプトの後にcompileを入力するなど、タスクの実行を開始するたびに、sbtは関連するタスクを再実行します.
sbtのマッピングは、プロジェクトを記述する場合、nameなどのsettingに対して固定文字列を保持することができるが、compileのようなタスクに対して実行可能なコードを保持しなければならない.実行可能コードが最終的に文字列を返しても、そのたびに再実行される.
与えられたキーは、タスクまたは通常のsettingを参照する必要があります.すなわち、「taskiness」(再実行するたびに)は、このキーのプロパティであり、値ではありません.
使用:=タスクを作成できます.タスクのコードは呼び出されるたびに実行されます.
hello := {println("Hello!")}

タイプシステムの観点から、task keyによって作成されたSettingはsetting keyによって作成されたSettingと少し異なり、taskKey:=42はSetting[Task[T]を返し、settingKey:=42はSetting[T]を返す.ほとんどの場合、これはそれほど変わらず、タスクが実行されるとtask keyはTタイプの値を作成します.(すなわち、TがStringである場合、task keyが呼び出されてもsetting keyが呼び出されても、返される値はStringタイプである)
TとTask[T]の隠れた違いは、setting keyの値はプロジェクトのロード時に1回しか評価されず、繰り返し実行できないため、setting keyに依存することはできません.
sbtインタラクティブモードでのKeys
sbtインタラクションモードでは、このタスクを実行するためにタスクの名前を入力できます.したがって、compileを入力するとcompileタスクが実行され、compileはtask keyです.
setting keyの名前を入力すると、setting keyの値が表示されます.task keyの名前を入力すると、タスクが実行されますが、結果値は表示されません.タスクの結果を見るにはshowを使います.
コンストラクション定義ファイルでは、keysはアルパカ式の名前を付けます(Scalaの慣例に従います)が、sbtコマンドラインではハイフン-区切り-単語で置き換えられます.これらのsbtで使用されるハイフン区切り文字列はKeysで定義されています.例えば、Keys.scalaは、キーを定義します.
val scalacOptions = TaskKey[Seq[String]]("scalac-options", "Options for the Scala compiler.")

sbtにscalac-optionsを入力しますが、構築定義ではscalacOptionsを使用します.
詳細については、sbtコマンドプロンプトの後にinspectと入力します.inspectに表示される情報の中には意味がないものもありますが、トップにsettingの値タイプとその簡単な説明が表示されています.
在build.sbtに導入
導入文をbuildに置くことができます.sbtの頭部;空の行で区切る必要はありません.
暗黙的にデフォルトでインポートされたものは次のとおりです.
import sbt._
import Process._
import Keys._

(また、.scalaファイルがある場合は、そのコンテンツ(BuildまたはPluginオブジェクト)がインポートされます.)
クラスライブラリ依存の追加
サードパーティクラスライブラリ依存性を追加するには、2つの方法があります.1つ目はjarパッケージをlib/(非管理依存)に配置し、2つ目は管理依存を追加しbuildに配置する.sbtでは、このように:
libraryDependencies += "org.apache.derby" % "derby" % "10.4.1.3"

libraryDependenciesは、+=オペレータ、および%メソッドの2つの複雑な状況に関連します.+=置換ではなく元の値に追加します.%メソッドは、文字列からivyモジュールIDを構築するために使用されます.