scala - SBT 中的排序和覆盖任务

标签 scala heroku playframework sbt sbt-native-packager

快速总结:我试图在顶层项目中等待所有 SBT 子模块构建,然后删除它们的 target目录。顶级应用程序聚合了所有子模块,它们不会单独部署,而只会作为具有类路径依赖项的捆绑包部署,而子模块中的重复库会炸毁整个包的大小,并且 slug 超出了 Heroku 的限制。

从技术上讲,我正在尝试 actually use this - 我正在尝试添加一个将在 stage 之后运行的“清理”任务.上面链接的解决方案似乎对我不起作用(Play 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 :
stage := {
  val f = (stage in Universal).value
  stageCleanupTask.value
  f
}

这似乎完全是错误的,因为这两个任务同时运行。
SBT也不是很容易,我在官方文档中没有找到太多,所以我只是在玩:
  • stage.flatMap期望返回 Task[U] 的函数, 但是 stageCleanupTaskTaskKey[T] , 和 .value在非常特定的区域之外不起作用,因此通过类似于 stage <<= stage.flatMap(f => stageCleanupTask.map(_ => f)) 的内容进行组合似乎无从谈起。
  • dependsOn只能用作 stage <<= stage dependsOn stageCleanupTask ,这与我想要的依赖链完全相反。 stageCleanupTask应该取决于 stage ,但类型不匹配(Task[Unit] vs Task[File])
  • 我试图在覆盖 stage 中尝试组合,如:
    stage := {
        (stage in Universal).map(f => /*follow up*/ f).value
    }
    

    但这通常只会给我耳光illegal dynamic dependencyillegal dynamic reference

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

    最佳答案

    让我先说baseDirectory.value / "modules" / "a" / "target"不是您想要使用的那种路径定义,因为使用 SBT 为您提供的设置要好得多。我推荐使用 (target in 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更进一步,但它可能是您正在寻找的东西。

    关于scala - SBT 中的排序和覆盖任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34841410/

    相关文章:

    scala - 访问该对象的变量

    python - Heroku - Python Shell 写入文件,但在 Django APP View 中不写入文件?

    ruby-on-rails - 更改 Heroku PostGRES 的字符限制不会更改数据库中的列

    ruby-on-rails - ruby rails : How to set a database timeout in application configuration?

    onStart 的 java Playframework GlobalSettings 弃用

    scala - 关于 Future.firstCompletedOf 和 Garbage Collect 机制

    scala - 如何使用 Scala 的不可变数据结构作为类的成员

    scala - Spark 与 Scala : Filter RDD by values contained in another list

    postgresql - 如何在保存为 Instant 的 Play-SLICK 中过滤日期?

    java - Play Framework/Java : A good way to send x-www-form-urlencoded data back