在TaskKey中使用输入参数

时间:2015-02-18 17:45:53

标签: scala sbt

我正在编写一个sbt插件,并创建了一个需要获取解析参数的TaskKey

  lazy val getManager = TaskKey[DeployManager]("Deploy manager")
  lazy val getCustomConfig = InputKey[String]("Custom config")
  ...

  getCustomConfig := {
    spaceDelimited("<arg>").parsed(0)
  }
  getManager := {
  val conf = configResource.evaluated
  ...

  }      

但是我在编译期间遇到了这个错误:

`parsed` can only be used within an input task macro, such as := or Def.inputTask.

我无法将getManager定义为InputKey,因为我后来多次使用它的值,而对于inputKey,每次评估都会重新创建值(我需要使用相同的实例)

1 个答案:

答案 0 :(得分:2)

在sbt中,你不能以合理的方式做你想做的事。 (在这种情况下,类型系统很好地阻止你这样做。)

想象一下,getManager是一个TaskKey,它接受​​已解析的参数(除了注释之外,命名的方式可能是manager,隐含了get

我现在决定,compile取决于getManager。如果我在shell中键入compile,那么getManager解析哪些参数?

sbt依赖树中没有参数的概念。它们只是一个浅薄的(和恕我直言,有点hackish)添加,以使更好的CLI。

如果您想使getManager可配置,您可以添加其他设置,getManager取决于,然后在命令行上使用set在必要时更改这些设置。

所以在你的情况下:

lazy val configResource = SettingKey[...]("Config resource")

getManager := {
  val conf = configResource.value
  // ...
}