将几个sbt任务合并为一个

时间:2015-01-15 22:48:19

标签: scala jenkins sbt sbt-native-packager

我对用于创建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>

1 个答案:

答案 0 :(得分:-1)

所以,我想你了:) 正如您已经提到的,在一个任务依赖于相同设置的单个任务中组合多个任务不会按预期工作。

相反,我们执行以下操作

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

    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似乎是正确的 解决这个问题的方法。不幸的是,之间需要清洁 每个版本都采用相同的输出格式。