我对创建 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 导致任务在我的任务运行之前得到评估,所以他们没有得到新的目标设置(如另一个问题所述:如何从我的 SBT 任务中调用另一个任务?)