2

我对创建 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 任务中调用另一个任务?

4

1 回答 1

0

因此,我为您解决了这个问题 :) 正如您已经提到的,将多个任务组合在一个任务中,其中一些任务依赖于相同的设置,并没有按预期工作。

相反,我们执行以下操作

  1. 为我们的每个自定义步骤创建一个任务,例如为新贵打包 debian
  2. 定义按顺序执行这些命令的别名

定义任务

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")

你可以在这里查看完整的代码。

更新

在别名中设置 SystemLoader 似乎是解决这个问题的正确方法。不幸的是,对于相同的输出格式,每次构建之间都需要进行清理。

于 2015-01-23T19:14:05.633 回答