Sbt 为什么inConfig(conf)(设置)不选择一些设置?

Sbt 为什么inConfig(conf)(设置)不选择一些设置?,sbt,Sbt,我认为inConfig(conf)(settings)会将所有设置复制到给定的配置中。但这似乎没有达到我的预期 给定一个配置: lazy val Monkjack: Configuration = config("monkjack") 那么我会: inConfig(Monkjack)(Defaults.compileSettings) 因此,我可以按照预期进行编译: sbt clean monkjack:compile [info] Compiling 17 Scala sources to

我认为
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选项(实际选项是不可逆的,这个选项很有用,因为它有详细的输出,所以很容易看到是否使用了它):

当我
monjack:compile
时,我看不到该选项被触发。好像上面的那一行没有加上。但是,如果我还添加了以下几行,它就可以工作了

sources in Monkjack := (sources in Compile).value
sourceDirectory in Monkjack := (sourceDirectory in Compile).value,
那么,为什么我需要最后两行,如果它没有达到我的预期,那么图中的
inConfig
实际上在做什么呢。另外一个奇怪的是,当我执行上述操作时,尽管它有效,但我得到了两个编译阶段,一个是
target/classes
,另一个是
target/monkjack classes

编辑(在不使用sources/sourceDirectory设置的情况下进行检查)

>检查树monkjack:编译
[info]monkjack:compile=Task[sbt.inc.Analysis]
[info]+-monkjack:compile::compileInputs=Task[sbt.Compiler$Inputs]
[info]|+-*:编译器=任务[sbt.Compiler$compilers]
[info]+-monkjack:sources=Task[scala.collection.Seq[java.io.File]]
[信息]|+-*/*:maxErrors=100
[info]|+-monkjack:incCompileSetup=Task[sbt.Compiler$IncSetup]

[info]+-monkjack:compile::streams=Task[sbt.std.TaskStreams[sbt.Init$ScopedKey[\up>tl;dr没有新配置的源意味着没有编译,因此没有使用
scalacOptions

发件人:

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

inConfig
只进行(重新)映射,以便针对给定范围初始化所有键-在本例中为
monkjack
配置

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

此处影响较大的设置有
sourceDirectory
sourceManaged
,它们在
sourceConfigPaths
(in)中设置如下:

lazy val sourceConfigPaths = Seq(
  sourceDirectory <<= configSrcSub(sourceDirectory),
  sourceManaged <<= configSrcSub(sourceManaged),
  ...
)
因此,如果您将源代码移动到
src/monkjack/scala
,则可以正常工作。如中所述:

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


你能做
show monkjack:scalacOptions
吗?你能看到
inspect tree monkjack:compile
中列出的
monkjack:scalacOptions
吗?>show monkjack:scalacOptions[info]列表(-Yshow syms)在问题中添加了检查输出。因此,我需要一个配置,通过添加一些额外的Scala选项来调整monkjack:compile范围。我想我可以调整编译范围本身,而不引入新的配置。这就是新配置背后的想法-更改多个设置,否则可以使用不太复杂的方式更改。我ed要做的比我的问题表明的要多得多:)我想让人们拥有插件,但只是偶尔使用命令行激活它。例如,sbt
something
compile或sbt something:compile。这样人们就可以有两个工作,一个是激活插件,一个是不激活。这就是为什么我认为我不能通过影响来完成它ng直接编译。为什么不用自己的任务创建插件呢?
> 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]     
lazy val sourceConfigPaths = Seq(
  sourceDirectory <<= configSrcSub(sourceDirectory),
  sourceManaged <<= configSrcSub(sourceManaged),
  ...
)
def configSrcSub(key: SettingKey[File]): Initialize[File] =
  (key in ThisScope.copy(config = Global), configuration) { (src, conf) => 
    src / nameForSrc(conf.name)
  }