如何使用TaskKey和SettingKey的值来定义设置?

时间:2014-07-14 14:53:22

标签: scala sbt

是否可以从TaskKey(例如unmanagedClasspath)和SettingKey(例如baseDirectory)计算这两个值,以便定义其他设置SettingKey

目前的目标是根据定义的依赖关系(sourceGenerators)和其他设置(classpathbaseDirectory,...)定义sourceManaged

仅使用SettingKey可以按照以下方式进行,但在此过程中包含TaskKey不起作用:

sourceGenerators in Compile <+= (baseDirectory in Compile).
  zip(sourceManaged in Compile).map(settingsValues ⇒ ???)

2 个答案:

答案 0 :(得分:2)

首先要做的事情是:使用TaskKeys设置SettingKey是不可能的。请参阅sbt。

的官方文档中的.sbt Build DefinitionMore Kinds of Setting

您可以通过以下代码解决它(在sbt 0.12.4及更低版本中)。

sourceGenerators in Compile <+= (baseDirectory, sourceManaged, managedClasspath in Compile) map { (b, s, c) =>
  Seq[File]()
}

但是我高度建议使用较新版本的sbt,这些版本提供了许多简化来定义设置和任务之间的关系(请记住,任务可以基于设置的值,但反之亦然)

例如,使用0.13.5,您可以按如下方式执行:

sourceGenerators in Compile += Def.task {
  val b = baseDirectory.value
  val s = sourceManaged.value
  val c = (managedClasspath in Compile).value
  Seq[File]()
}.taskValue

显然,在这个过于简单化的示例中,值bsc被丢弃,因为它们不用于计算最后一个表达式Seq[File]()成为结果值。

答案 1 :(得分:0)

作为临时解决方案,我定义了一个自定义的TaskKey,该任务分配了一个元组,从其他SettingKey&amp; TaskKey,然后我通过此自定义键分配sourceGenerators映射。我不知道这是否是一种更直接的方式,不需要定义这样的临时自定义密钥。

val generatorsConfig = TaskKey[(File, File, Classpath)](
  "reactive-mongo-generators-config", "Source generators configuration")

generatorsConfig := (
  (baseDirectory in Compile).value,
  (sourceManaged in Compile).value, 
  (managedClasspath in Compile).value)

sourceGenerators in Compile <+= generatorsConfig map { d =>
  val (base, managed, cp) = d
  Seq[File]() // Define according base, managed and classpath
}