SBT:如何在多个任务中重用带有参数的代码?
Posted
技术标签:
【中文标题】SBT:如何在多个任务中重用带有参数的代码?【英文标题】:SBT: how to reuse code with parameters in multiple tasks? 【发布时间】:2021-02-22 09:12:15 【问题描述】:很抱歉,SBT 多年来并没有变得更简单......
我有一个使用sbt.version=0.13.5
的项目,我在Build.scala
中定义了一些自定义任务。
我有一个任务对我的工件进行一些重新打包,它是使用:=
表示法编写的,如:
val myPackage = taskKey[File]("Package distributive")
val myPackageTask = myPackage :=
// uses .value and streams
// returns File of repackaged artifact
它工作正常。但是,我想重用该代码调用它作为方法/参数为:
def myPackageCode(param: String): File =
// the same code using .value and streams only using the `param`
// returns File as above
val packageNo1 = taskKey[File]("Package distributive option 1")
val packageNo1Task = packageNo1 := myPackageCode("1")
val packageNo2 = taskKey[File]("Package distributive option 2")
val packageNo2Task = packageNo2 := myPackageCode("2")
编译失败:value
只能在任务定义宏中的任务上调用,例如 :=、+=、++= 或 Def.task。
如何使其工作:重用带有参数的任务代码?
【问题讨论】:
你为什么还在 0.13 上?至此,1.0 已经发布了三年。 原因很明显,我有很多项目,没有足够的时间让每个项目都保持最新版本。 这仅适用于最新版本的 sbt。也许你应该花时间来更新…… @MatthiasBerndt 当然这是一个选项,但有句好话“如果它没有坏,就不要修复它” 但它确实坏了,你花了很多时间来修复它。 【参考方案1】:经过试验和研究,我使其工作如下:
// wrapped the original code in Def.taskDyn Def.task ...
def myPackageCode(param: String) = Def.taskDyn Def.task
// the same code using .value and streams only using the `param`
// returns File as above
val packageNo1 = taskKey[File]("Package distributive option 1")
// changed := to <<= in "assignment" to key
val packageNo1Task = packageNo1 <<= myPackageCode("1")
“简单”,一如既往地使用简单的构建工具:)
【讨论】:
以上是关于SBT:如何在多个任务中重用带有参数的代码?的主要内容,如果未能解决你的问题,请参考以下文章
如何使 SBT 任务依赖于同一个 SBT 项目中定义的模块?