gpt4 book ai didi

sbt - 为什么 inConfig(conf)(settings) 不选择一些设置?

转载 作者:行者123 更新时间:2023-12-04 16:46:37 26 4
gpt4 key购买 nike

我以为inConfig(conf)(settings)会将所有设置复制到给定的配置中。但这似乎并没有达到我的预期。

给定一个配置:

lazy val Monkjack: Configuration = config("monkjack")

然后我这样做:
inConfig(Monkjack)(Defaults.compileSettings)

所以我可以按照我的预期进行编译:
sbt clean monkjack:compile
[info] Compiling 17 Scala sources to ...
[success] Total time: 9 s, completed 01-Sep-2014 09:40:41

所以现在我想在使用这个新配置时调整 scalac 选项(实际选项无关紧要,这个选项很有用,因为它有详细的输出,所以很容易看到它是否被使用):
scalacOptions in Monkjack := Seq("-Yshow-syms")

当我 monjack:compile ,我没有看到这个选项被触发。就像没有添加上面的行一样。但是,如果我还添加以下几行,它会起作用!
sources in Monkjack := (sources in Compile).value
sourceDirectory in Monkjack := (sourceDirectory in Compile).value,

那么为什么我需要最后两行以及什么是 inConfig实际上在做,如果它没有做我期望的。更奇怪的是,当我执行上述操作时,虽然它有效,但我得到了两个编译阶段,一个转到 target/classes和一个去 target/monkjack-classes .

编辑(在没有源/源目录设置的情况下检查)
> inspect tree monkjack:compile
[info] monkjack:compile = Task[sbt.inc.Analysis]
[info] +-monkjack:compile::compileInputs = Task[sbt.Compiler$Inputs]
[info] | +-*:compilers = Task[sbt.Compiler$Compilers]
[info] | +-monkjack:sources = Task[scala.collection.Seq[java.io.File]]
[info] | +-*/*:maxErrors = 100
[info] | +-monkjack:incCompileSetup = Task[sbt.Compiler$IncSetup]
[info] | +-monkjack:compile::streams = Task[sbt.std.TaskStreams[sbt.Init$ScopedKey[_ <: Any]]]
[info] | | +-*/*:streamsManager = Task[sbt.std.Streams[sbt.Init$ScopedKey[_ <: Any]]]
[info] | |
[info] | +-*/*:sourcePositionMappers = Task[scala.collection.Seq[scala.Function1[xsbti.Position, scala.Option[xsbti.Position]]]]
[info] | +-monkjack:dependencyClasspath = Task[scala.collection.Seq[sbt.Attributed[java.io.File]]]
[info] | +-monkjack:classDirectory = target/scala-2.11/monkjack-classes
[info] | +-monkjack:scalacOptions = Task[scala.collection.Seq[java.lang.String]]
[info] | +-*:javacOptions = Task[scala.collection.Seq[java.lang.String]]
[info] | +-*/*:compileOrder = Mixed
[info] |
[info] +-monkjack:compile::streams = Task[sbt.std.TaskStreams[sbt.Init$ScopedKey[_ <: Any]]]
[info] +-*/*:streamsManager = Task[sbt.std.Streams[sbt.Init$ScopedKey[_ <: Any]]]
[info]

最佳答案

tl;博士 没有新配置的来源意味着没有编译,因此没有使用 scalacOptions .

来自 When to define your own configuration :

If your plugin introduces either a new set of source code or its own library dependencies, only then you want your own configuration.


inConfig仅进行(重新)映射以便为给定范围初始化所有键 - 在这种情况下是 monkjack配置。

换句话说, inConfig计算新范围中设置的值。

这里影响比较大的设置是 sourceDirectorysourceManaged设置在 sourceConfigPaths (在 Defaults.sourceConfigPaths 中)如下:
lazy val sourceConfigPaths = Seq(
sourceDirectory <<= configSrcSub(sourceDirectory),
sourceManaged <<= configSrcSub(sourceManaged),
...
)
configSrcSub gives the answer (稍微重新格式化以方便阅读):
def configSrcSub(key: SettingKey[File]): Initialize[File] =
(key in ThisScope.copy(config = Global), configuration) { (src, conf) =>
src / nameForSrc(conf.name)
}

这导致了如果您将源移动到 src/monkjack/scala 的答案那会工作得很好。这在 Scoping by configuration axis 中有描述:

A configuration defines a flavor of build, potentially with its own classpath, sources, generated packages, etc. (...) By default, all the keys associated with compiling, packaging, and running are scoped to a configuration and therefore may work differently in each configuration.

关于sbt - 为什么 inConfig(conf)(settings) 不选择一些设置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25602173/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com