当前位置: 首页 > 知识库问答 >
问题:

将多个sbt任务合并为一个

许安邦
2023-03-14
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"
 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任务中调用另一个任务?)

共有1个答案

有宏峻
2023-03-14

所以,我想出了这一点:)正如你已经提到的,将多个任务组合在一个任务中,其中一些任务依赖于相同的设置,并不像预期的那样成功。

相反,我们执行以下操作

  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似乎是解决这一问题的正确方法。不幸的是,对于相同的输出格式,在每个构建之间必须进行清理。

 类似资料:
  • 我在同一个excel表中有3000个类似于这些表的表: PS:我只需要csv表中指定的信息

  • 我必须将多个PDF合并为一个PDF。 我正在使用iText。sharp库和collect转换了代码并尝试使用它(从这里)实际的代码是C#,我将其转换为VB.NET。 我现在收到以下错误: 已添加具有相同密钥的项目。 我做了一些调试,并将问题归结为以下几行: 为什么会出现这种错误?

  • 问题内容: 我有三个表,, 与下面的数据 页 标签 页面标签 我想在一个查询中获得一个包含SQL每一页的对应标签名的字符串。这是我想要的输出。 SQL可能吗? 我正在使用MySQL。尽管如此,如果可能的话,我希望有一个独立于数据库供应商的解决方案。 问题答案: 塞尔吉奥·德尔阿莫(Sergio del Amo): 但是,我没有没有标签的页面。我想我需要用左外部联接编写查询。 不是一个非常漂亮的查询

  • 问题内容: 如何将这两个JToken合并为一个JToken。听起来应该很简单,但无法解决。 谢谢您的帮助! 到目前为止,这是我尝试过的: 我首先将第一个对象分配给变量,然后尝试将其连接到第二个变量。我有一个循环,可以带回具有三个字段的多个页面。最终目标是抓取每个页面并创建一个包含所有页面的大J。 像这样的东西: 问题答案: 您可以用来将一个合并到另一个。请注意,可以控制数组的合并方式。从Enume

  • 问题内容: 我正在写一个小脚本来帮助日本假名记忆。我如何将以下列表合并为一个?我尝试如下。 问题答案: 单程:

  • 问题内容: 我正在尝试不同的JOIN查询,但没有得到想要的结果。 我有2张桌子: 我找不到想要的结果。 我想得到以下结果: 问题答案: 您不能具有这样的动态列数,但是可以 将数据连接 成字符串: 或者您可以使用或手动 旋转行( 我更喜欢后一种方法,对我来说似乎更灵活,但是在某些情况下可以大大减少代码量): 您还可以将前面的语句转换为 动态SQL, 如下所示: