このページでは、sbt が特定のビルドの設定をロードするメカニズムと、ユーザーがすべてを制御できるフックについて概説します。
他の場所で述べたように、sbt は Setting[_] オブジェクトを介して初期化グラフとタスクグラフを構築します。設定とは、ビルド状態の他の Keys に保存されている値を取得し、特定のビルドキーの新しい値を生成できるものです。 sbt は、登録されたすべての Setting[_] オブジェクトを巨大な線形シーケンスに変換し、それらをタスクグラフにコンパイルします。このタスクグラフは、ビルドを実行するために使用されます。
sbt のすべてのロードセマンティクスは、Load.scala ファイルに含まれています。おおよそ次のようになります。
青い円は、sbt がプロジェクトをロードするときに発生するアクションを表しています。 sbt はロード時に次のアクションを実行することがわかります。
ユーザーレベルのプロジェクトをコンパイルします (~/.sbt/<version>/)
a. このプロジェクトで定義されたプラグインをロードします (~/.sbt/<version>/plugins/*.sbt および ~/.sbt/<version>/plugins/project/*.scala) b. 定義されたすべての設定をロードします (~/.sbt/<version>/*.sbt および ~/.sbt/<version>/plugins/*.scala)
現在のプロジェクトをコンパイルします (<working-directory/project)
a. 定義されたすべてのプラグインをロードします (project/plugins.sbt および project/project/*.scala) b. プロジェクトをロード/コンパイルします (project/*.scala)
*.sbt ファイルをロードします (build.sbt など)。これらの各ロードは、複数の設定シーケンスを定義します。 図は、最も重要な 2 つを示しています。
buildSettings - これらは in ThisBuild または Build オブジェクトに対して直接定義された設定です。 それらは、ビルドに対して *1回* 初期化されます。 これらは、たとえば build.sbt ファイルに追加できます。
ThisBuild / foo := "hi"
projectSettings - これらはプロジェクトに固有の設定です。 それらは、ビルド内の*特定のサブプロジェクト*に固有です。 プラグインが複数のプロジェクトにその設定を提供している場合、値は各プロジェクトで複製されます。 プロジェクト固有の設定は、たとえば project/build.scala に追加します。
lazy val root = (project in file(".")).settings(...)
すべてのビルド定義のロード/コンパイル後、sbt は順序付けなければならない Seq[Setting[_]] のシリーズを持っています。 図に示すように、sbt のデフォルトの包含順序は次のとおりです。
~/.sbt/<version>/*.sbt) で定義されたすべての設定build.sbt)