SBTでスコープ委任がどのように機能するかを理解するためにリファレンスを読みました。
上記のリファレンスページから、演習Dを抜粋しました。
ThisBuild / scalacOptions += "-Ywarn-unused-import"
lazy val projD = (project in file("d"))
.settings(
test := {
println((Compile / console / scalacOptions).value)
},
console / scalacOptions -= "-Ywarn-unused-import",
Compile / scalacOptions := scalacOptions.value // added by sbt
)
projD / testを実行した場合、何が表示されますか?
リスト()
リスト(-Ywarn-unused-import)
他に何か?
そして彼らの推論は
答えはList(-Ywarn-unused-import)です。ルール2はprojD / Compile / Zeroを検出し、ルール3はprojD / Zero / consoleを検出し、ルール4はThisBuild / Zero / Zeroを検出します。ルール1は、サブプロジェクト軸projDがあり、構成軸がタスク軸よりも優先されるため、projD / Compile / Zeroを選択します。
これまでのところ、Compile / console / sclacOptionsがprojD / Compile / zero / scalacOptionsにスコープされる理由を理解できました。これは、projD / Compute / zeroの構成軸が、知りたいキー(Compile / console / scalacOptions)と比較して、projD / zero / consoleよりも具体的であるためです。
次に、Compile / scalacOptionsはscalacOptions.valueを参照します。次に、projD / Zero / Zeroのデリゲートを見つける必要があります。ルール4はThisBuild / Zero / Zeroを検出するため、List(-Ywarn-unused-import)に解決されます。
ここでは、ThisBuild / Zero / ZeroがprojD / Compile / Zeroに勝つ理由がわかりませんでした。見つけたいキーのスコープはprojD / zero / zeroであるため、projD / Compile / zeroは、Thisbuild [リファレンスのルール1に従う]と比較してより具体的な値を持ちます。
その理由は、Compile / scalacOptionsにscalacOptions.valueの値があるためだと思います。これは再帰的定義を生成します。次に、projD / Zero /コンソールを使用できます。
説明の後半にある差分スコープへの参照について、少し混乱していると思います。例のすべてのスコープを明示的に書き留めましょう。
ThisBuild / Zero / Zero / scalacOptions += "-Ywarn-unused-import"
lazy val projD = (project in file("d"))
.settings(
test := { println((Compile / console / scalacOptions).value) }
)
projD / Zero / console / scalacOptions -= "-Ywarn-unused-import"
projD / Compile / Zero / scalacOptions := (projD / Zero / Zero / scalacOptions).value
を参照できるようにするために、これら2つの設定を削除する必要projD
がありましたが、それ以外は同じ定義です。
だから、最初の部分から、あなたはその理解projD / Compile / Zero / scalacOptions
の上に勝利をprojD / Zero / console / scalacOptions
とThisBuild / ...
。
それでは、その価値を取り上げて、タスクで使用してみましょう。しかし、その価値は何ですか?projD / Zero / Zero / scalacOptions
明示的に定義されていないものを指します。したがって、その代理人を見つける必要があります。この時点で我々はすでにと競合していないprojD / Compile
とprojD / console
し、範囲内の唯一のフィットキーがスコープ内にありますThisBuild / Zero / Zero
。
私はここでそれを説明しようとしました(/ scalacOptions
スペースを節約するためにを省略しています):
projD / Compile / console // the one we need in the task
projD / Zero / console // could be applied by rule 3, but looses to the next one:
projD / Compile / Zero // applies by rule 2 (task scope delegation), defined with next one:
projD / Zero / Zero // not defined explicitly, so is delegated:
ThisBuild / Zero / Zero // applies by rule 4 (project scope delegation)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加