我正在编写一个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
,每次评估都会重新创建值(我需要使用相同的实例)
答案 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
// ...
}