1. 設定システムとのインタラクション

設定システムとのインタラクション 

sbtの中心にあるのは、広範なカスタマイズを可能にするように設計された新しい設定システムです。このページの目的は、設定システムの背後にある一般的なモデルと、それを使用する方法を説明することです。入門ガイド(.sbtファイルを参照)では、設定を定義する方法について説明しています。このページでは、コマンドラインで設定を操作したり、探索したりする方法について説明します。

コマンド、タスク、設定の選択 

設定またはタスクへの完全修飾参照は次のようになります。

{<build-uri>}<project-id>/config:intask::key

この「スコープ付きキー」参照は、lastinspectのようなコマンドで使用され、実行するタスクを選択するときに使用されます。パーサーで通常必要なのは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タスクがなく、最初に検索された構成であるcompilerunを定義しているためです。したがって、Test構成のrunタスクを参照するには、Test/runのように構成軸を指定する必要があります。明示的なTest/軸が必要な他の例を次に示します。

> Test/consoleQuick
> Test/console
> Test/doc
> Test/package

タスク固有の設定 

一部の設定はタスクごとに定義されます。これは、同じ構成(compiletestなど)に、packagepackageSrcpackageDocなど、いくつかの関連タスクがある場合に使用されます。パッケージタスクの場合、それらの設定は、パッケージするファイル、使用するオプション、および生成する出力ファイルです。各パッケージタスクは、これらの設定に対して異なる値を持つことができる必要があります。

これは、設定を適用するタスクを選択するタスク軸で行われます。たとえば、次のコードは、異なるパッケージタスクの出力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コマンドによって提供される情報は、変更する適切な設定を見つけるのに役立ちます。consolefullClasspathのようなキーの慣例では、Scala識別子はキャメルケースですが、String表現は小文字でダッシュで区切られています。構成のScala識別子は、compiletestのようなタスクと区別するために大文字になっています。たとえば、前の例から、Scalaインタープリターが起動したときに実行されるコードを追加する方法を推測できます。

> set Compile / console / initialCommands := "import mypackage._"
> console
...
import mypackage._
...

inspectは、consoleCompile / 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にリストされているスコープが、定義された値が見つかるまで順番に検索されることを意味します。