scala – 在SBT中排序和覆盖任务
快速总结:我正在等待所有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 } 这似乎是错误的,因为这两个任务同时运行. > stage.flatMap需要一个返回Task [U]的函数,但是stageCleanupTask是一个TaskKey [T],而且.value在非常特定的区域之外不起作用,所以通过类似于<< = stage .flatMap(f => stageCleanupTask.map(_ => f))似乎是不成问题的. 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,但这可能是你要找的东西. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |