Scala 将多个sbt任务合并为一个

Scala 将多个sbt任务合并为一个,scala,jenkins,sbt,sbt-native-packager,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-s

我对创建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本机包任务。(是的,我意识到我正在编译它三次;但是sbt native packager似乎没有工件目录的设置)

这在bash提示符下运行良好,但我一直在尝试将相同的目标放在jenkins中(用$WORKSPACE替换$PWD),但我似乎无法获得正确的报价。我认为,在by 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导致任务在我的任务运行之前得到评估,因此它们无法获得新的目标设置(如另一个问题所述:)

因此,我为您解决了这个问题:) 正如您已经提到的,将多个任务合并到一个任务中,其中一些任务依赖于相同的设置,这并不能像预期的那样起作用

相反,我们做了以下工作

  • 为每个自定义步骤创建一个任务,例如为upstart打包debian
  • 定义按顺序执行这些命令的别名
  • 定义任务 示例任务实现 实现非常简单,并且对于每个应用程序都是一样的 任务

    // 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似乎是正确的 解决这个问题的方法。不幸的是,两人之间必须进行清洁
    每个版本都具有相同的输出格式。

    因此,我为您解决了这个问题:) 正如您已经提到的,将多个任务合并到一个任务中,其中一些任务依赖于相同的设置,这并不能像预期的那样起作用

    相反,我们做了以下工作

  • 为每个自定义步骤创建一个任务,例如为upstart打包debian
  • 定义按顺序执行这些命令的别名
  • 定义任务 示例任务实现 实现非常简单,并且对于每个应用程序都是一样的 任务

    // 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似乎是正确的 解决这个问题的方法。不幸的是,两人之间必须进行清洁
    每个生成都具有相同的输出格式。

    我不确定,但您是否尝试将每个自定义
    packageBin
    步骤提取到自定义任务中,然后使用
    packageAll
    将它们聚合?如果只更改一次输出目录,则可以在Rpm中使用
    target设置输出目录,或者在Debian中使用
    target设置输出目录。@Muki我希望我可以在[Setting]
    中使用
    target设置输出目录,但是如果您仔细观察,您会发现我为Debian更改了两次目标,一次为Upstart ServerLoader,一次为SystemV ServerLoader。如何将每个packageBin提取到自定义任务中?我不确定,但您是否尝试将每个自定义
    packageBin
    步骤提取到自定义任务中,然后将它们与
    packageAll
    聚合?如果只更改一次输出目录,则可以在Rpm中使用
    target设置输出目录,或者在Debian中使用
    target设置输出目录。@Muki我希望我可以在[Setting]
    中使用
    target设置输出目录,但是如果您仔细观察,您会发现我为Debian更改了两次目标,一次为Upstart ServerLoader,一次为SystemV ServerLoader。如何将每个packageBin提取到自定义任务中?此解决方案不起作用。它将包重命名为deb upstart,而不是将其放在目录中(我尝试在
    val输出之后添加
    scalax.file.Path(output.createDirectory()
    ,但它仍然重命名包,而不是将它们放在自己的目录中)。此外,如果您运行
    dpkgdeb-cdebsystemv
    ,您将看到它实际上是upstart版本
    .value
    在自定义任务之前运行这些任务。唯一的方法是使用命令。我一直在努力做一件事;如果我能弄明白,我可能会发出请求。我更新了示例。任务内部的设置似乎没有被sbt正确处理,或者是以另一种方式完成的。通过别名从外部进行设置是有效的。为我正确创建了目录,并按说明移动文件
    IO.move(包、输出文件夹)
    。此解决方案不起作用。它将包重命名为deb upstart,而不是将其放在目录中(我尝试在
    val输出之后添加
    scalax.file.Path(output.createDirectory()
    ,但它仍然重命名包,而不是将它们放在自己的目录中)。此外,如果您运行
    dpkgdeb-cdebsystemv
    ,您将看到它实际上是upstart版本
    .value
    在自定义任务之前运行这些任务。唯一的方法是使用命令。我一直在努力做一件事;如果我能弄明白,我可能会发出请求。我更新了示例。任务内部的设置似乎没有被sbt正确处理,或者是以另一种方式完成的。通过别名从外部进行设置是有效的。为我正确创建了目录,并按说明移动文件<代码>IO.move(包、输出文件夹)