为什么inConfig(conf)(settings)没有选择一些设置



我认为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;dr没有新配置的源意味着没有编译,因此没有使用scalacOptions

从何时定义您自己的配置:

如果你的插件引入了一组新的源代码或它自己的库依赖项,那么你只需要自己的配置。

inConfig只进行(重新)映射,以便为给定范围初始化所有密钥——在本例中为monkjack配置。

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

此处影响较大的设置是sourceDirectorysourceManaged,它们在sourceConfigPaths(在Defaults.sourceConfigPaths中)中设置如下:

lazy val sourceConfigPaths = Seq(
  sourceDirectory <<= configSrcSub(sourceDirectory),
  sourceManaged <<= configSrcSub(sourceManaged),
  ...
)

configSrcSub给出了答案(稍微重新格式化以便于阅读):

def configSrcSub(key: SettingKey[File]): Initialize[File] =
  (key in ThisScope.copy(config = Global), configuration) { (src, conf) => 
    src / nameForSrc(conf.name)
  }

这就引出了这样一个答案:如果您将源代码移动到src/monkjack/scala,那会很好。如配置轴范围界定中所述:

配置定义了构建的风格,可能有自己的类路径、源、生成的包等。(…)默认情况下,与编译、打包和运行相关联的所有键都在一个配置的范围内,因此在每个配置中的工作方式可能不同。

最新更新