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:如何在多个任务中重用带有参数的代码?的主要内容,如果未能解决你的问题,请参考以下文章

Flutter - 如何在多个地方重用一些代码

如何使 SBT 任务依赖于同一个 SBT 项目中定义的模块?

如何在多个项目中使用 sbt-native-packager

如何在sbt中启用多个监视源?

从 Eclipse 运行 SBT 任务

如何编写可重用的 Javascript?