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

时间:2014-09-01 08:54:59

标签: sbt

我认为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

编辑(不使用sources / sourceDirectory设置进行检查)

> 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]     

1 个答案:

答案 0 :(得分:3)

tl; dr 新配置的来源不代表编译,因此不使用scalacOptions

来自When to define your own configuration

  

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

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

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

此处影响较大的设置是sourceDirectorysourceManagedsourceConfigPathsDefaults.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中描述:

  

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