【发布时间】:2015-03-14 11:54:37
【问题描述】:
我对创建 Scala 任务的 Scala/SBT 文档有些困惑。目前我可以从命令行运行以下命令:
sbt ";set target := file(\"$PWD/package/deb-upstart\"); set serverLoading in Debian := com.typesafe.sbt.packager.archetypes.ServerLoader.Upstart; debian:packageBin; set target := file(\"$PWD/package/deb-systemv\"); set serverLoading in Debian := com.typesafe.sbt.packager.archtypes.ServerLoader.SystemV; debian:packageBin; set target := file(\"$PWD/package/rpm-systemd\"); rpm:packageBin"
这会将我的目标每次重置到不同的目录(deb-upstart、deb-systemv 和 rpm-systemd),并为每个设置运行一个 sbt-native-package 任务。 (是的,我意识到我正在编译它三个不同的时间;但是 sbt-native-packager 似乎没有工件目录的设置)
这在 bash 提示符下工作正常,但我一直试图将相同的目标放入 jenkins(用 $WORKSPACE 替换 $PWD),但我似乎无法正确转义引号。我认为通过 build.sbt 或 project/Build.scala 来运行所有这三个任务的任务可能更容易,每次都更改目标变量(并用完整路径替换 $PWD 或 $TARGET的基本目录)。
我尝试了以下方法:
lazy val packageAll = taskKey[Unit]("Creates deb-upstart, deb-systenv and rpm-systemd packages")
packageAll := {
target := baseDirectory.value / "package" / "deb-upstart"
serverLoading in Debian := com.typesafe.sbt.packager.archetypes.ServerLoader.Upstart
(packageBin in Debian).value
target := baseDirectory.value / "package" / "deb-systemv"
serverLoading in Debian := com.typesafe.sbt.packager.archetypes.ServerLoader.SystemV
(packageBin in Debian).value
target := baseDirectory.value / "package" / "rpm-systemd"
(packageBin in Rpm).value
}
但问题是 .value 会导致任务在我的任务运行之前得到评估,因此他们没有获得新的目标设置(如另一个问题所述:How can I call another task from my SBT task?)
【问题讨论】:
-
我不确定,但您是否尝试将每个自定义
packageBin步骤提取到自定义任务中,然后将它们与packageAll聚合?如果只更改一次输出目录,也可以使用target in Rpm或target in Debian设置。 -
@Muki 我希望我可以只是
target in [Setting]但如果你仔细看,你会发现我为 Debian 更改了两次目标,一次用于 Upstart ServerLoader,一次用于 SystemV ServerLoader。我将如何将每个 packageBin 提取到自定义任务中?
标签: scala jenkins sbt sbt-native-packager