我有一个包含多个子项目的大根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中做到这一点的方法吗?
答案 0 :(得分:1)
是的,这是可能的。在object
目录下创建SbtProjectImplicits.scala
(project
)(取决于您的项目结构),例如:
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)