运行 任务的默认参数

Default arguments for run task

我的项目需要几个参数才能启动。像这样

sbt run -DONE_ARG.0=some_big_string -DANOTHER_ARG=another_big_string -DONE_MORE_ARG=with_big_value

在大多数情况下,这些参数具有典型值。如果未在命令行中设置这些参数,我可以在 build.sbt 中为其定义默认值吗?

由于您正在设置系统属性,因此您还可以在构建中检查这些属性,如果还没有,则进行配置。

如果 forktrue,您需要设置 javaOptions。否则,您可以简单地更改当前 运行 JVM 的系统属性。

val defaultOptions = Map(
  "ONE_ARG.0" -> "some_big_string",
  "ANOTHER_ARG" -> "another_big_string",
  "ONE_MORE_ARG" -> "with_big_value"
)

// use default options, if not overriden
val options = (defaultOptions ++ sys.props.filterKeys(defaultOptions.keySet)).toMap

Compile / run := {
  val willFork = fork.value

  if (!willFork) {
    options.foreach { case (k, v) => sys.props(k) = v }
  }
  (Compile / run).inputTaskValue
}

javaOptions ++= {
  val willFork = fork.value

  if (willFork) {
    options
      .map { case (k, v) => s"-D$k=$v" }
      .toSeq
  } else {
    Seq.empty[String]
  }
}

我还不知道这有多正确,但我这样做了并且它按预期工作:

lazy val defaultProperties = settingKey[Map[String, String]]("Default JVM properties")
lazy val setDefaultProps = taskKey[Unit]("Sets the default properties")

defaultProperties := Map(
  "ONE_ARG.0" -> "some_big_string",
  "ANOTHER_ARG" -> "another_big_string",
  "ONE_MORE_ARG" -> "with_big_value"
)

setDefaultProps := {
  val willFork = fork.value
  val defaults = defaultProperties.value
  val options = defaults ++ sys.props.filterKeys(defaults.keySet)

  if (!willFork) {
    options.foreach { case (k, v) => sys.props(k) = v }
  } else {
    javaOptions ++= options.map { case (k, v) => s"-D$k=$v" }.toSeq
  }
}

Compile / run := (Compile / run).dependsOn(setDefaultProps).evaluated

非常感谢@cbley 的提示。