【发布时间】:2016-04-22 20:06:39
【问题描述】:
快速总结:我试图在顶层项目中等待所有 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]的函数,但stageCleanupTask是TaskKey[T],而.value在非常特定的区域之外不起作用,因此通过类似于 @ 的东西进行组合987654337@似乎是不可能的。dependsOn只能作为stage <<= stage dependsOn stageCleanupTask工作,这与我想要的依赖链完全相反。stageCleanupTask应该依赖于stage,但类型不匹配(Task[Unit]vsTask[File])-
我试图在覆盖的
stage中尝试组合,如下所示:stage := { (stage in Universal).map(f => /*follow up*/ f).value }但那通常只会打我
illegal dynamic dependency或illegal dynamic reference的耳光
排序 SBT 任务的首选方式是什么?
【问题讨论】:
-
我不知道您的问题的答案,但就减少 Heroku 应用程序的 slug 大小而言,您可以分叉 buildpack 并修改此部分以包含您的
targetsub-目录:github.com/heroku/heroku-buildpack-scala/blob/master/bin/… -
我也会接受 PR 在这里添加 SBT_POST_TASKS:github.com/heroku/heroku-buildpack-scala/blob/master/bin/…
-
@codefinger 谢谢,我一定会调查 SBT_POST_TASKS - 虽然没有承诺,bash(尤其是健壮的脚本)不是我的强项 :)
-
我做出了改变。 github.com/heroku/heroku-buildpack-scala/commit/… 如果你可以在help.heroku.com 开票,我可以告诉你如何使用 buildpack 的这个分支并提供更多信息。我宁愿从这个帖子中讨论出来。
-
@codefinger SBT 唯一的解决方案应该是完全可能的;)它被称为
Simple Build Tool是有原因的
标签: scala heroku playframework sbt sbt-native-packager