web-dev-qa-db-ja.com

ThisBuildスコープとグローバルスコープの違いは何ですか?

誰かがこれらの2行を書くことの違いを私に説明できますか?

resolvers in ThisBuild ++= appResolvers

resolvers in Global ++= appResolvers
36

完全な説明については、 スコープ をお読みください。

関連する部分を引用します:

3つのスコープ軸があります。

  • サブプロジェクト軸
  • 依存関係構成軸
  • タスク軸

プロジェクト軸によるスコープ

1つのビルドに複数のプロジェクトを配置する場合、各プロジェクトには独自の設定が必要です。つまり、プロジェクトに応じてキーのスコープを設定できます。

プロジェクト軸をThisBuildに設定することもできます。これは「ビルド全体」を意味するため、設定は単一のプロジェクトではなくビルド全体に適用されます。ビルドレベルの設定は、プロジェクトでプロジェクト固有の設定が定義されていない場合のフォールバックとしてよく使用されます。

ゼロスコープコンポーネント

各スコープ軸には、軸タイプのインスタンス(Some(_)に類似)を入力するか、軸に特別な値Zeroを入力できます。したがって、ZeroNoneと考えることができます。

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_を参照している場合、次の順序で表示されます。

  1. _projFoo / version_
  2. _ThisBuild / version_
  3. _Global / version_

Global設定の場合のように(_inspect version_を参照)、デフォルト設定のスコープがversionの場合、_ThisBuild / version_または_Global / version_のいずれかを使用するとビルド内のすべてのプロジェクトのバージョン番号を設定できます。ここでのThisBuildの選択は、ほとんど慣例によるものです。

2つのスコープを区別したい場合があります。 1つは、ソースの依存関係です。 sbtには、複数のビルドにわたるサブプロジェクトに依存するための組み込みサポートがあります。このような場合、ThisBuildを使用すると、ある設定が他のビルドに波及するのを防ぐことができます。

コマンドの動作やsbt自体の動作を構成するために、一部の機能がグローバルスコープの設定を具体的に参照する場合もあります。 _Global / concurrentRestrictions_はその一例です。この場合、_Global / concurrentRestrictions_を使用する必要があります。

25
Eugene Yokota

これはおそらくプラグインで使用されます:

resolvers in Global ++= appResolvers

これはビルド定義に表示される可能性がありますが、

resolvers in ThisBuild ++= appResolvers

これにより、プラグインによって提供されるグローバルデフォルトを上書きできます。

同じビルド定義内で、どちらかを使用すると、デリゲートリストの下位2つであるため、同等の効果が得られる可能性があります。

10