【问题标题】:How to use the values of TaskKey and SettingKey to define setting?如何使用 TaskKey 和 SettingKey 的值来定义设置?
【发布时间】:2014-07-15 18:30:43
【问题描述】:

是否可以同时计算来自 TaskKey(例如 unmanagedClasspath)和 SettingKey(例如 baseDirectory)的值,以定义其他设置 SettingKey

当前目标是根据定义的依赖项 (classpath) 和其他设置 (baseDirectory, sourceManaged, ...) 定义 sourceGenerators

仅使用SettingKey 可以按以下方式完成,但在此过程中包含TaskKey 不能按原样工作:

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

【问题讨论】:

  • 你使用的是哪个版本的 sbt?

标签: scala sbt


【解决方案1】:

首先要做的事情是:无法使用 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]()

【讨论】:

  • 当您想从 baseDirectory、sourceManaged 和 managedClasspath 一起计算值时,第一个 sn-p 将不起作用(从一些获取设置值,对于其他的 Task[T],不能很好地混合)。第二种方法很好,我只使用&lt;+= 不必“解包”定义任务。 sourceGenerators in Compile &lt;+= Def.task { generateActorSystem(baseDirectory.value, sourceManaged.value,(managedClasspath in Compile).value) }
  • @applicius 只是出于好奇,您能否举一个示例,其中第一个剪断不起作用?你得到什么错误?例如,我可以将所有三个值的内容输出到控制台。
  • 应该不可能.map tuple (SettingKey[File],SettingKey[File],TaskKey[Classpath]),但确实有效。我想有一些隐含的魔法。我更喜欢Def.task { x.value } 更明确的方式。
  • @applicius 是的,有一些隐含的魔法,但我也更喜欢Def.task 的方式。无论哪种方式,如果这对您有用,您介意接受它作为答案吗?
【解决方案2】:

作为一个临时解决方案,我定义了一个自定义 TaskKey,它分配有一个从其他 SettingKey 和 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
}

【讨论】:

    猜你喜欢
    • 2019-05-28
    • 2017-06-07
    • 2015-12-05
    • 2014-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多