1. クラスパス、ソース、およびリソース

クラスパス、ソース、およびリソース 

このページでは、sbtが`compile`、`run`、`test`などのさまざまなアクションに対してクラスパスをどのように構築するか、およびこれらのクラスパスをオーバーライドまたは拡張する方法について説明します。

基本 

sbtでは、クラスパスにはScalaライブラリと(依存関係として宣言されている場合)Scalaコンパイラが含まれています。クラスパス関連の設定とタスクは、通常、`Classpath`型の値を提供します。これは`Seq[Attributed[File]]`のエイリアスです。Attributedは、各クラスパスエントリに異種マップを関連付ける型です。現在、これにより、sbtはコンパイルの結果である`Analysis`を対応するクラスパスエントリに関連付けることができ、管理されたエントリの場合、依存関係を定義した`ModuleID`と`Artifact`を関連付けることができます。

生の`Seq[File]`を明示的に抽出するには、`Classpath`に追加された暗黙の`files`メソッドを使用します。

val cp: Classpath = ...
val raw: Seq[File] = cp.files

`Seq[File]`から`Classpath`を作成するには`classpath`を使用し、`File`から`Attributed[File]`を作成するには`Attributed.blank`を使用します。

val raw: Seq[File] = ...
val cp: Classpath = raw.classpath

val rawFile: File = ..
val af: Attributed[File] = Attributed.blank(rawFile)

管理されていないものと管理されているもの 

クラスパス、ソース、およびリソースは、管理されていないものと管理されているものの2つの主要なカテゴリに分類されます。管理されていないファイルは、ビルドの制御外にある手動で作成されたファイルです。これらはビルドへの入力です。管理されているファイルは、ビルドの制御下にあります。これには、生成されたソースとリソース、解決および取得された依存関係、およびコンパイルされたクラスが含まれます。

管理対象ファイルを生成するタスクは、次のように挿入する必要があります。

Compile / sourceGenerators +=
    generate( (Compile / sourceManaged).value / "some_directory")

この例では、`generate`は`File => Seq[File]`型の関数であり、実際に作業を実行します。そのため、メインソースジェネレーター(`Compile / sourceGenerators`)のリストに新しいタスクを追加しています。

名前付きタスクを挿入するには、プラグインでより良いアプローチです。

val mySourceGenerator = taskKey[Seq[File]](...)

Compile / mySourceGenerator :=
  generate( (Compile / sourceManaged).value / "some_directory")

Compile / sourceGenerators += (Compile / mySourceGenerator)

`task`メソッドは、タスクの結果ではなく、実際のタスクを参照するために使用されます。

リソースの場合、同様のキー`resourceGenerators`と`resourceManaged`があります。

名前によるソースファイルの除外 

プロジェクトの基本ディレクトリは、デフォルトで`src/main/scala`に加えてソースディレクトリです。以下のように、名前(例では`butler.scala`)でソースファイルを除外できます。

unmanagedSources / excludeFilter := "butler.scala"

プロジェクトフォルダ内の.scalaソースファイルをどのように除外するか - Google Groupsで詳細をご覧ください。

外部と内部 

クラスパスは、内部依存関係と外部依存関係にも分割されます。内部依存関係はプロジェクト間の依存関係です。これにより、あるプロジェクトの出力が別のプロジェクトのクラスパスに効果的に配置されます。

外部クラスパスは、管理されていないクラスパスと管理されているクラスパスの和集合です。

キー 

クラスパスについては、関連するキーは次のとおりです。

  • unmanagedClasspath
  • managedClasspath
  • externalDependencyClasspath
  • internalDependencyClasspath

ソースの場合

  • `unmanagedSources` これらはデフォルトで、scalaSourceとjavaSourceからなるunmanagedSourceDirectoriesから構築されます。
  • `managedSources` これらは生成されたソースです。
  • `sources` `managedSources`と`unmanagedSources`を組み合わせたものです。
  • `sourceGenerators` これらはソースファイルを生成するタスクです。通常、これらのタスクは、sourceManagedによって提供されるディレクトリにソースを配置します。

リソースの場合

  • `unmanagedResources` これらはデフォルトで、デフォルトのdefaultExcludesによって一致するファイルを排除したresourceDirectoryであるunmanagedResourceDirectoriesから構築されます。
  • `managedResources` デフォルトでは、標準プロジェクトでは空です。sbtプラグインには、ここに生成された記述子ファイルがあります。
  • `resourceGenerators` これらはリソースファイルを生成するタスクです。通常、これらのタスクは、resourceManagedによって提供されるディレクトリにリソースを配置します。

詳細については、inspectコマンドを使用してください。

関連するStackOverflowの回答も参照してください。

 

実行時にクラスパスからxxx.propertiesを読み込むライブラリを使用するスタンドアロンのプロジェクトがあるとします。「config」ディレクトリの中にxxx.propertiesを配置します。「sbt run」を実行するときに、そのディレクトリをクラスパスに含めたいとします。

Runtime / unmanagedClasspath += baseDirectory.value / "config"