加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 在SBT中排序和覆盖任务

发布时间:2020-12-16 09:18:25 所属栏目:安全 来源:网络整理
导读:快速总结:我正在等待所有SBT子模块的顶级项目构建,然后删除其目标目录.顶级应用程序聚合所有子模块,它们将不会单独部署,而只能作为具有类路径依赖性的捆绑包,而子模块中的重复库会破坏整个软件包的大小,并且该数据块将超过Heroku限制. 从技术上来说,我试图
快速总结:我正在等待所有SBT子模块的顶级项目构建,然后删除其目标目录.顶级应用程序聚合所有子模块,它们将不会单独部署,而只能作为具有类路径依赖性的捆绑包,而子模块中的重复库会破坏整个软件包的大小,并且该数据块将超过Heroku限制.

从技术上来说,我试图到actually use this – 我试图添加一个’清理’任务,将在后台运行.从上面的链接的解决方案对我来说似乎不起作用(播放2.4,SBT 0.13.5),错误说它比我可以更好:

build.sbt:50: error: reference to stage is ambiguous;
it is imported twice in the same scope by
import _root_.com.typesafe.sbt.packager.universal.UniversalPlugin.autoImport._
and import $52e59eb09172b3222f9e._
stage := {

假设我有我的清理任务:

val stageCleanupTask = taskKey[Unit]("Clean after stage task")

stageCleanupTask := {
  val log = streams.value.log
  if (sys.env.getOrElse("POST_STAGE_CLEAN","false").equals("true")) {
    log.info("Cleaning submodules' target directories")
    sbt.IO.delete(baseDirectory.value / "modules" / "a" / "target")
    sbt.IO.delete(baseDirectory.value / "modules" / "b" / "target")
    sbt.IO.delete(baseDirectory.value / "modules" / "c" / "target")
  }
}

我正在追赶舞台:

stage := {
  val f = (stage in Universal).value
  stageCleanupTask.value
  f
}

这似乎是错误的,因为这两个任务同时运行.
SBT并不是真的很容易,我没有在官方文档中找到很多,所以我只是在玩耍:

> stage.flatMap需要一个返回Task [U]的函数,但是stageCleanupTask是一个TaskKey [T],而且.value在非常特定的区域之外不起作用,所以通过类似于<< = stage .flatMap(f => stageCleanupTask.map(_ => f))似乎是不成问题的.
> dependsOn只能作为stage< = stage dependsOn stageCleanupTask起作用,这与我想要的依赖关系链完全相反. stageCleanupTask应该依赖于stage,但类型不匹配(Task [Unit] vs Task [File])
>我正在尝试在复仇舞台上进行组合,如:

stage := {
    (stage in Universal).map(f => /*follow up*/ f).value
}

但是通常只是用非法的动态依赖或非法动态引用来打扰我

什么是SBT任务排序的首选方法?

解决方法

让我开始说baseDirectory.value /“modules”/“a”/“target”不是要使用的那种路径定义,因为使用SBT提供的设置要好得多.我建议使用(在moduleName中的目标).value.

至于你的主要问题,我建议你这样做:

val stageCleanupTask = taskKey[sbt.File]("Clean after stage task")

lazy val root = project.in(file("."))
  ...
  .settings(
    stageCleanupTask := {
      val a = (stage in Universal).value
      val log = streams.value.log
      if (sys.env.getOrElse("POST_STAGE_CLEAN","false").equals("true")) {
        log.info("Cleaning submodules' target directories")
        sbt.IO.delete((target in a).value)
        sbt.IO.delete((target in b).value)
        sbt.IO.delete((target in c).value)
      }
      a
    },stage <<= stageCleanupTask

我刚刚在我自己的一个项目中进行测试,它的工作完美无缺.

编辑1

我的电池正在死亡,所以我不能再看看this,但这可能是你要找的东西.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读