1. ライブラリ依存関係

ライブラリ依存関係 

このページは、特にビルド定義スコープタスクグラフについて、以前の入門ページを読んでいることを前提としています。

ライブラリ依存関係は2つの方法で追加できます

  • アンマネージド依存関係は、libディレクトリに配置されたJARファイルです。
  • マネージド依存関係は、ビルド定義で設定され、リポジトリから自動的にダウンロードされます。

アンマネージド依存関係 

ほとんどの人は、アンマネージドではなくマネージド依存関係を使用します。しかし、アンマネージドは開始時にはよりシンプルです。

アンマネージド依存関係は次のように機能します。JARファイルをlibに追加すると、プロジェクトのクラスパスに配置されます。それだけです!

ScalaCheckSpecs2ScalaTestなどのテストJARもlibに配置できます。

lib内の依存関係は、すべてのクラスパス(compiletestrunconsole)に適用されます。これらのいずれかのクラスパスだけを変更したい場合は、たとえばCompile / dependencyClasspathまたはRuntime / dependencyClasspathを調整します。

アンマネージド依存関係を使用するためにbuild.sbtに追加するものは何もありませんが、libではなく別のディレクトリを使用したい場合は、unmanagedBaseキーを変更できます。

libの代わりにcustom_libを使用するには

unmanagedBase := baseDirectory.value / "custom_lib"

baseDirectoryはプロジェクトのルートディレクトリなので、ここではタスクグラフで説明されている特別なvalueメソッドを使用して、baseDirectoryに応じてunmanagedBaseを変更しています。

unmanagedBaseディレクトリからのJARファイルをリストするunmanagedJarsタスクもあります。複数のディレクトリを使用したり、他の複雑な処理を行いたい場合は、unmanagedJarsタスク全体を、別の処理を行うタスク(例:libディレクトリ内のファイルに関係なく、Compile設定のリストを空にする)に置き換える必要があるかもしれません。

Compile / unmanagedJars := Seq.empty[sbt.Attributed[java.io.File]]

マネージド依存関係 

sbtはCoursierを使用してマネージド依存関係を実装しているため、Coursier、Apache Ivy、またはMavenに精通している場合は、それほど苦労しません。

libraryDependenciesキー 

ほとんどの場合、libraryDependencies設定に依存関係をリストするだけで済みます。Maven POMファイルまたはIvy設定ファイルを作成して依存関係を外部的に設定し、sbtがそれらの外部設定ファイルを使用することも可能です。詳細についてはこちらをご覧ください。

依存関係の宣言は次のようになります。ここで、groupIdartifactIdrevisionは文字列です。

libraryDependencies += groupID % artifactID % revision

または、configurationが文字列またはConfiguration値(Testなど)の場合、次のようになります。

libraryDependencies += groupID % artifactID % revision % configuration

libraryDependenciesKeysで次のように宣言されています。

val libraryDependencies = settingKey[Seq[ModuleID]]("Declares managed dependencies.")

%メソッドは文字列からModuleIDオブジェクトを作成し、それらのModuleIDlibraryDependenciesに追加します。

もちろん、sbt(Coursier経由)はモジュールをどこからダウンロードするかを知る必要があります。モジュールがsbtが付属するデフォルトのリポジトリのいずれかに存在する場合は、そのまま動作します。たとえば、Apache Derbyは標準のMaven2リポジトリにあります。

libraryDependencies += "org.apache.derby" % "derby" % "10.4.1.3"

それをbuild.sbtに入力してupdateを実行すると、sbtはDerbyをCoursierキャッシュにダウンロードします。(ちなみに、updatecompileの依存関係なので、ほとんどの場合、updateを手動で入力する必要はありません。)

もちろん、++=を使用して、一度に複数の依存関係を追加することもできます。

libraryDependencies ++= Seq(
  groupID % artifactID % revision,
  groupID % otherID % otherRevision
)

まれに、libraryDependencies:=を使用する理由が見つかる場合があります。

%%を使用した正しいScalaバージョンの取得 

organization % moduleName % versionではなくorganization %% moduleName % version(違いはorganizationの後の二重の%%)を使用すると、sbtはプロジェクトのバイナリScalaバージョンをアーティファクト名に追加します。これは単なるショートカットです。%%なしで記述することもできます。

libraryDependencies += "org.scala-stm" % "scala-stm_2.13" % "0.9.1"

ビルドのscalaVersion2.13.12であると仮定すると、次のものは同一です("org.scala-stm"の後の二重の%%に注意してください)。

libraryDependencies += "org.scala-stm" %% "scala-stm" % "0.9.1"

多くの依存関係は複数のScalaバージョンに対してコンパイルされており、バイナリ互換性を確保するためにプロジェクトと一致するものを取得したいという考えです。

詳細については、クロスビルドを参照してください。

Ivyリビジョン 

organization % moduleName % versionversionは、単一の固定バージョンである必要はありません。Ivyは、指定された制約に従って、モジュールの最新リビジョンを選択できます。"1.6.1"のような固定リビジョンではなく、"latest.integration""2.9.+"、または"[1.0,)"を指定します。詳細については、Ivyリビジョンのドキュメントを参照してください。

場合によっては、Mavenの「バージョン範囲」(例:[1.3.0,))を使用して依存関係(推移的またはその他)を指定することがあります。依存関係の特定のバージョンがビルドで宣言されており、その範囲を満たしている場合、sbtは指定されたバージョンを使用します。そうでない場合、Coursierはインターネットにアクセスして最新バージョンを見つける可能性があります。これにより、ライブラリの範囲条件を満たす特定のバージョンが指定されている場合でも、有効なバージョンが時間の経過とともに変化するという予期しない動作が発生する可能性があります。

ビルド内で満足できるバージョンが見つかった場合に使用するように、Mavenのバージョン範囲は下限に置き換えられます。この動作を無効にするには、JVMフラグ-Dsbt.modversionrange=falseを使用します。

リゾルバー 

すべてのパッケージが同じサーバーにあるわけではありません。sbtはデフォルトで標準のMaven2リポジトリを使用します。依存関係がデフォルトのリポジトリのいずれにもない場合は、リゾルバーを追加してIvyがそれを検索できるようにする必要があります。

追加のリポジトリを追加するには、次を使用します。

resolvers += name at location

2つの文字列の間に特別なatを使用します。

例:

resolvers += "Sonatype OSS Snapshots" at "https://oss.sonatype.org/content/repositories/snapshots"

resolversキーはKeysで次のように定義されています。

val resolvers = settingKey[Seq[Resolver]]("The user-defined additional resolvers for automatically managed dependencies.")

atメソッドは2つの文字列からResolverオブジェクトを作成します。

リポジトリとして追加すると、sbtはローカルMavenリポジトリを検索できます。

resolvers += "Local Maven Repository" at "file://"+Path.userHome.absolutePath+"/.m2/repository"

または、便宜上

resolvers += Resolver.mavenLocal

他のタイプのレポジトリの定義の詳細については、Resolversを参照してください。

デフォルトのレゾルバーのオーバーライド 

resolversには、デフォルトのレゾルバーは含まれません。ビルド定義によって追加されたもののみが含まれます。

sbtは、resolversといくつかのデフォルトのリポジトリを組み合わせてexternalResolversを形成します。

したがって、デフォルトのレゾルバーを変更または削除するには、resolversではなくexternalResolversをオーバーライドする必要があります。

構成ごとの依存関係 

多くの場合、依存関係はテストコード(src/test/scalaTest構成によってコンパイルされる)で使用されますが、メインコードでは使用されません。

依存関係をTest構成でのみクラスパスに表示させ、Compile構成には表示させたくない場合は、次のように% "test"を追加します。

libraryDependencies += "org.apache.derby" % "derby" % "10.4.1.3" % "test"

Test構成の型安全なバージョンも次のように使用できます。

libraryDependencies += "org.apache.derby" % "derby" % "10.4.1.3" % Test

これで、sbtインタラクティブプロンプトでshow Compile/dependencyClasspathと入力すると、derby jarは表示されません。しかし、show Test/dependencyClasspathと入力すると、derby jarがリストに表示されます。

通常、ScalaCheckSpecs2ScalaTestなどのテスト関連の依存関係は、% "test"で定義されます。

ライブラリ依存関係に関する詳細とヒントは、このページにあります。