Scala 将多个sbt任务合并为一个
我对创建Scala任务的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
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导致任务在我的任务运行之前得到评估,因此它们无法获得新的目标设置(如另一个问题所述:)因此,我为您解决了这个问题:) 正如您已经提到的,将多个任务合并到一个任务中,其中一些任务依赖于相同的设置,这并不能像预期的那样起作用 相反,我们做了以下工作
// 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似乎是正确的
解决这个问题的方法。不幸的是,两人之间必须进行清洁
每个版本都具有相同的输出格式。因此,我为您解决了这个问题:) 正如您已经提到的,将多个任务合并到一个任务中,其中一些任务依赖于相同的设置,这并不能像预期的那样起作用 相反,我们做了以下工作
// 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(包、输出文件夹)
。