我认为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]
答案 0 :(得分:3)
tl; dr 新配置的来源不代表编译,因此不使用scalacOptions
。
来自When to define your own configuration:
如果您的插件引入了一组新的源代码或它自己的库依赖项,那么您只需要自己的配置。
inConfig
仅进行(重新)映射,以便为给定范围初始化所有密钥 - 在本例中为monkjack
配置。
换句话说,inConfig
计算新范围中设置的值。
此处影响较大的设置是sourceDirectory
和sourceManaged
,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中描述:
配置定义了构建的风格,可能有自己的类路径,源,生成的包等。(...) 默认情况下,与编译,打包和运行相关的所有键都限定为一个配置,因此在每个配置中可能会有不同的工作方式。