是否可以使用隐式类扩展build.sbt语法?

时间:2017-08-15 14:09:25

标签: scala sbt

我有一个包含多个子项目的大根sbt项目。在这些项目定义中,我试图删除许多代码重复。

例如,每个程序集项目都包含以下代码:

project
  .enablePlugins(sbtassembly.AssemblyPlugin)
  .settings(
    mainClass in Compile := Some(mainClassName),
    assemblyJarName in assembly := jarName,
    assemblyMergeStrategy in assembly := {
      case PathList("META-INF", xs@_*) => MergeStrategy.discard
      case PathList("sandbox.sc") => MergeStrategy.discard
      case PathList("org", "joda", "time", xs@_*) => MergeStrategy.first
      case PathList("reference.conf") => MergeStrategy.concat
      case x => MergeStrategy.deduplicate
    }
  )

相反,我想写这样的东西:

project
  .assembly(className, jarName)

是否可以实现这样的语法?我知道可以使用隐式类在典型的scala文件中实现此语法。这是在sbt中做到这一点的方法吗?

1 个答案:

答案 0 :(得分:1)

是的,这是可能的。在object目录下创建SbtProjectImplicits.scalaproject)(取决于您的项目结构),例如:

your-project/
   project/SbtProjectImplicits.scala
   src/
   ...

SbtProjectImplicits.scala对象内容可能如下:

object SbtProjectImplicits {
    implicit class ProjectSettings(p: sbt.Project) {
      def assembly(className: Class, jarName): sbt.Project = {
        p.settings(
         mainClass in Compile := Some(mainClassName),
         assemblyJarName in assembly := jarName,
         ...
        )
        p
      }
    }
}

所以你可以在build.sbt中这样做:

import SbtProjectImplicits._
project
  .assembly(className, jarName)