在 TaskKey 中使用输入参数

Using input args inside a TaskKey

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

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

假设 getManager 是一个接受解析参数的 TaskKey(请注意,sbt 的命名方式可能是 manager,隐含 get ).

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

sbt 依赖树中没有参数的概念。它们只是一个肤浅的(恕我直言,有点老套)的补充,以提供更好的 CLI。

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

所以在你的情况下:

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

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