运行 任务的默认参数
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 中为其定义默认值吗?
由于您正在设置系统属性,因此您还可以在构建中检查这些属性,如果还没有,则进行配置。
如果 fork
是 true
,您需要设置 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 的提示。
我的项目需要几个参数才能启动。像这样
sbt run -DONE_ARG.0=some_big_string -DANOTHER_ARG=another_big_string -DONE_MORE_ARG=with_big_value
在大多数情况下,这些参数具有典型值。如果未在命令行中设置这些参数,我可以在 build.sbt 中为其定义默认值吗?
由于您正在设置系统属性,因此您还可以在构建中检查这些属性,如果还没有,则进行配置。
如果 fork
是 true
,您需要设置 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 的提示。