我对用于创建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?)< / p>
答案 0 :(得分:-1)
所以,我想你了:) 正如您已经提到的,在一个任务依赖于相同设置的单个任务中组合多个任务不会按预期工作。
相反,我们执行以下操作
lazy val packageDebianUpstart = taskKey[File]("creates deb-upstart package")
lazy val packageDebianSystemV = taskKey[File]("creates deb-systenv package")
lazy val packageRpmSystemD = taskKey[File]("creates rpm-systenv package")
实现非常简单,每个实现都相同 任务。
// don't forget this
import com.typesafe.sbt.packager.archetypes._
packageDebianUpstart := {
// define where you want to put your stuff
val output = baseDirectory.value / "package" / "deb-upstart"
// run task
val debianFile = (packageBin in Debian).value
// place it where you want
IO.move(debianFile, output)
output
}
现在使用
将这些任务组合成一个别名addCommandAlias("packageAll", "; clean " +
"; set serverLoading in Debian := com.typesafe.sbt.packager.archetypes.ServerLoader.SystemV" +
"; packageDebianSystemV " +
"; clean " +
"; set serverLoading in Debian := com.typesafe.sbt.packager.archetypes.ServerLoader.Upstart" +
"; packageDebianUpstart " +
"; packageRpmSystemD")
您可以查看完整代码here。
在别名内设置SystemLoader似乎是正确的 解决这个问题的方法。不幸的是,之间需要清洁 每个版本都采用相同的输出格式。