誰かがこれらの2行を書くことの違いを私に説明できますか?
resolvers in ThisBuild ++= appResolvers
resolvers in Global ++= appResolvers
完全な説明については、 スコープ をお読みください。
関連する部分を引用します:
3つのスコープ軸があります。
- サブプロジェクト軸
- 依存関係構成軸
- タスク軸
プロジェクト軸によるスコープ
1つのビルドに複数のプロジェクトを配置する場合、各プロジェクトには独自の設定が必要です。つまり、プロジェクトに応じてキーのスコープを設定できます。
プロジェクト軸を
ThisBuild
に設定することもできます。これは「ビルド全体」を意味するため、設定は単一のプロジェクトではなくビルド全体に適用されます。ビルドレベルの設定は、プロジェクトでプロジェクト固有の設定が定義されていない場合のフォールバックとしてよく使用されます。ゼロスコープコンポーネント
各スコープ軸には、軸タイプのインスタンス(
Some(_)
に類似)を入力するか、軸に特別な値Zero
を入力できます。したがって、Zero
はNone
と考えることができます。
Zero
は、すべてのスコープ軸のユニバーサルフォールバックですが、ほとんどの場合、直接使用するのはsbtおよびプラグインの作成者に限定する必要があります。
Global
は、Zero
をすべての軸に設定するスコープです:_Zero / Zero / Zero
_。つまり、_Global / someKey
_は_Zero / Zero / Zero / someKey
_の省略形です。ビルド定義でスコープを参照する
_Global / concurrentRestrictions := Seq( Tags.limitAll(1) )
_(_
Global / concurrentRestrictions
_は暗黙的に_Zero / Zero / Zero / concurrentRestrictions
_に変換され、すべての軸がZero
スコープコンポーネントに設定されます。タスクと構成はデフォルトですでにZero
であるため、ここでの効果はプロジェクトZero
、つまり、ProjectRef(uri("file:/tmp/hello/"), "root") / Zero / Zero / concurrentRestrictions
ではなく_Zero / Zero / Zero / concurrentRestrictions
_を定義します)
したがって、上記のように、Global
は3つの軸すべてをZero
に設定しますが、ThisBuild
はサブプロジェクト軸のみをThisBuild
に設定します。これは、ThisBuild
を構成のような他の軸と組み合わせる場合に意味があります。
_> set ThisBuild / Test / name := "test-name"
[info] Defining ThisBuild / Test / name
_
2020年2月の更新:Stefan Kがコメントで述べたように スコープ委任ルール は私が含めなかった重要な事実です上記の説明。
ルール4:スコープが指定されている場合、デリゲートスコープは、サブプロジェクト軸を次の順序で置き換えることによって検索されます:指定されたサブプロジェクト、
ThisBuild
、次にZero
。
たとえば、公開構成が_projFoo / version
_を参照している場合、次の順序で表示されます。
projFoo / version
_ThisBuild / version
_Global / version
_Global
設定の場合のように(_inspect version
_を参照)、デフォルト設定のスコープがversion
の場合、_ThisBuild / version
_または_Global / version
_のいずれかを使用するとビルド内のすべてのプロジェクトのバージョン番号を設定できます。ここでのThisBuild
の選択は、ほとんど慣例によるものです。
2つのスコープを区別したい場合があります。 1つは、ソースの依存関係です。 sbtには、複数のビルドにわたるサブプロジェクトに依存するための組み込みサポートがあります。このような場合、ThisBuild
を使用すると、ある設定が他のビルドに波及するのを防ぐことができます。
コマンドの動作やsbt自体の動作を構成するために、一部の機能がグローバルスコープの設定を具体的に参照する場合もあります。 _Global / concurrentRestrictions
_はその一例です。この場合、_Global / concurrentRestrictions
_を使用する必要があります。
これはおそらくプラグインで使用されます:
resolvers in Global ++= appResolvers
これはビルド定義に表示される可能性がありますが、
resolvers in ThisBuild ++= appResolvers
これにより、プラグインによって提供されるグローバルデフォルトを上書きできます。
同じビルド定義内で、どちらかを使用すると、デリゲートリストの下位2つであるため、同等の効果が得られる可能性があります。