sbtの中心にあるのは、広範なカスタマイズを可能にするように設計された新しい設定システムです。このページの目的は、設定システムの背後にある一般的なモデルと、それを使用する方法を説明することです。入門ガイド(.sbtファイルを参照)では、設定を定義する方法について説明しています。このページでは、コマンドラインで設定を操作したり、探索したりする方法について説明します。
設定またはタスクへの完全修飾参照は次のようになります。
{<build-uri>}<project-id>/config:intask::key
この「スコープ付きキー」参照は、last
やinspect
のようなコマンドで使用され、実行するタスクを選択するときに使用されます。パーサーで通常必要なのはkey
のみです。残りのオプション部分はスコープを選択します。これらのオプション部分は、個別にスコープ軸と呼ばれます。上記の説明では、{<build-uri>}
と<project-id>/
はプロジェクト軸を指定し、config:
は構成軸、intask
はタスク固有の軸を指定します。指定されていないコンポーネントは、現在のプロジェクト(プロジェクト軸)、または自動検出されたもの(構成軸およびタスク軸)とみなされます。アスタリスク(*
)は、*/*:key
のように、Global
コンテキストを明示的に参照するために使用されます。
構成が指定されていない場合(つまり、config:
の部分が省略されている場合)、キーがGlobal
で定義されている場合は、それが選択されます。それ以外の場合は、キーを定義する最初の構成が選択されます。ここで、順序はプロジェクト定義のconfigurations
メンバーによって決定されます。デフォルトでは、この順序はcompile, test, ...
です。
たとえば、/home/user/sample/
のビルドにあるプロジェクトroot
で実行すると、次のようになります。
> compile
> Compile/compile
> root/compile
> root/Compile/compile
> {file:/home/user/sample/}root/Compile/compile
別の例として、run
自体はCompile/run
を指します。これは、グローバルなrun
タスクがなく、最初に検索された構成であるcompile
がrun
を定義しているためです。したがって、Test
構成のrun
タスクを参照するには、Test/run
のように構成軸を指定する必要があります。明示的なTest/
軸が必要な他の例を次に示します。
> Test/consoleQuick
> Test/console
> Test/doc
> Test/package
一部の設定はタスクごとに定義されます。これは、同じ構成(compile
やtest
など)に、package
、packageSrc
、packageDoc
など、いくつかの関連タスクがある場合に使用されます。パッケージタスクの場合、それらの設定は、パッケージするファイル、使用するオプション、および生成する出力ファイルです。各パッケージタスクは、これらの設定に対して異なる値を持つことができる必要があります。
これは、設定を適用するタスクを選択するタスク軸で行われます。たとえば、次のコードは、異なるパッケージタスクの出力jarを出力します。
> package::artifactPath
[info] /home/user/sample/target/scala-2.8.1.final/demo_2.8.1-0.1.jar
> packageSrc::artifactPath
[info] /home/user/sample/target/scala-2.8.1.final/demo_2.8.1-0.1-src.jar
> packageDoc::artifactPath
[info] /home/user/sample/target/scala-2.8.1.final/demo_2.8.1-0.1-doc.jar
> test:package::artifactPath
[info] /home/user/sample/target/scala-2.8.1.final/root_2.8.1-0.1-test.jar
単一のコロン:
は構成軸に続き、二重コロン::
はタスク軸に続くことに注意してください。
このセクションでは、設定間の関係を調べるのに役立つinspect
コマンドについて説明します。たとえば、別の設定に影響を与えるために変更する必要がある設定を特定するために使用できます。
inspect
によって提供される最初の情報は、タスクの型または設定の値と型です。出力の次のセクションには「提供元」というラベルが付けられています。これは、設定が定義されている実際のスコープを示します。たとえば、
> inspect libraryDependencies
[info] Setting: scala.collection.Seq[sbt.ModuleID] = List(org.scalaz:scalaz-core:6.0-SNAPSHOT, org.scala-tools.testing:scalacheck:1.8:test)
[info] Provided by:
[info] {file:/home/user/sample/}root/*:libraryDependencies
...
これは、libraryDependencies
がグローバル構成(*:
)の現在のプロジェクト({file:/home/user/sample/}root
)で定義されていることを示しています。update
のようなタスクの場合、出力は次のようになります。
> inspect update
[info] Task: sbt.UpdateReport
[info] Provided by:
[info] {file:/home/user/sample/}root/*:update
...
inspect
出力の「関連」セクションには、キーのすべての定義がリストされます。たとえば、
> inspect compile
...
[info] Related:
[info] test:compile
これは、要求されたCompile/compile
タスクに加えて、Test/compile
タスクもあることを示しています。
前方依存関係は、設定(またはタスク)を定義するために使用される他の設定(またはタスク)を示します。逆依存関係は、与えられた設定を使用するものを逆方向に示します。inspect
は、要求された依存関係または実際の依存関係のいずれかに基づいて、この情報を提供します。要求された依存関係は、設定が直接指定するものです。実際の依存関係は、それらの依存関係が解決されるものです。この区別については、次のセクションで詳しく説明します。
例として、console
を見てみましょう。
> inspect console
...
[info] Dependencies:
[info] Compile / console / initialCommands
[info] Compile / console / streams
[info] Compile / console / compilers
[info] Compile / console / cleanupCommands
[info] Compile / console / taskTemporaryDirectory
[info] Compile / console / scalaInstance
[info] Compile / console / scalacOptions
[info] Compile / console / fullClasspath
...
これは、console
タスクへの入力を示しています。Compile / console / fullClasspath
およびCompile / console / scalacOptions
からクラスパスとオプションを取得していることがわかります。したがって、inspect
コマンドによって提供される情報は、変更する適切な設定を見つけるのに役立ちます。console
やfullClasspath
のようなキーの慣例では、Scala識別子はキャメルケースですが、String表現は小文字でダッシュで区切られています。構成のScala識別子は、compile
やtest
のようなタスクと区別するために大文字になっています。たとえば、前の例から、Scalaインタープリターが起動したときに実行されるコードを追加する方法を推測できます。
> set Compile / console / initialCommands := "import mypackage._"
> console
...
import mypackage._
...
inspect
は、console
がCompile / console / initialCommands
設定を使用していることを示しました。initialCommands
文字列をScala識別子に変換すると、initialCommands
が得られます。compile
は、これがメインソース用であることを示しています。console /
は、設定がconsole
に固有であることを示しています。このため、たとえば、consoleQuick
タスクに影響を与えることなく、console
タスクで初期コマンドを設定できます。
inspect actual <スコープ付きキー>
は、使用される実際の依存関係を示します。委譲は、依存関係が要求されたスコープ以外のスコープから発生する可能性があることを意味するため、これは便利です。inspect actual
を使用すると、設定の値を提供しているスコープを正確に確認できます。inspect actual
を通常のinspect
と組み合わせることで、設定に影響を与える範囲のスコープを確認できます。要求された依存関係の例に戻ると、
> inspect actual console
...
[info] Dependencies:
[info] Compile / console / streams
[info] Global / taskTemporaryDirectory
[info] scalaInstance
[info] Compile / scalacOptions
[info] Global / initialCommands
[info] Global / cleanupCommands
[info] Compile / fullClasspath
[info] console / compilers
...
initialCommands
の場合、グローバルスコープ(Global
)から取得されることがわかります。これを、inspect console
からの関連出力と組み合わせると、
Compile / console / initialCommands
initialCommands
をグローバルスコープと同じくらい一般的に、現在のプロジェクトのconsole
タスクスコープと同じくらい具体的に、またはその間の任意に設定できることがわかります。これは、たとえば、プロジェクト全体にinitialCommands
を設定でき、console
に影響を与えることを意味します。
> set initialCommands := "import mypackage._"
...
ここで設定したい理由は、他のコンソールタスクがこの値を使用するようになるためです。inspect actual
の逆依存関係の出力を確認すると、新しい設定を使用するタスクを確認できます。
> inspect actual initialCommands
...
[info] Reverse dependencies:
[info] Compile / console
[info] Test / console
[info] consoleProject
[info] Test / consoleQuick
[info] Compile / consoleQuick
...
これで、プロジェクト全体にinitialCommands
を設定することで、そのプロジェクト内のすべての構成のすべてのコンソールタスクに影響を与えることがわかりました。プロジェクトのクラスパスを使用できないconsoleProject
に初期コマンドを適用したくない場合は、より具体的なタスク軸を使用できます。
> set console / initialCommands := "import mypackage._"
> set consoleQuick / initialCommands := "import mypackage._"`
または構成軸
> set Compile/ initialCommands := "import mypackage._"
> set Test / initialCommands := "import mypackage._"
次のパートでは、スコープの委譲チェーンを示す委任セクションについて説明します。
設定にはキーとスコープがあります。スコープA内のキーに対する要求は、Aがそのキーに対する値を定義していない場合、別のスコープに委譲されることがあります。委譲チェーンは明確に定義されており、inspect
コマンドのDelegatesセクションに表示されます。Delegatesセクションには、要求されたキーの値が定義されていない場合にスコープが検索される順序が示されます。
例として、再度console
の初期コマンドについて考えてみましょう。
> inspect console/initialCommands
...
[info] Delegates:
[info] console / initialCommands
[info] initialCommands
[info] ThisBuild / console / initialCommands
[info] ThisBuild / initialCommands
[info] Zero / console / initialCommands
[info] Global / initialCommands
...
これは、console/initialCommands
に特定の値がない場合、Delegatesにリストされているスコープが、定義された値が見つかるまで順番に検索されることを意味します。