2017-08-15 79 views
0

我有一個很大的root sbt項目,其中包含幾個子項目。在這些項目定義中,有很多代碼重複,我試圖刪除。是否可以使用隱式類來擴展build.sbt語法?

例如每個組件項目包含以下代碼:

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

相反,我想寫出這樣的事情:

project 
    .assembly(className, jarName) 

是否有可能實現這樣的語法?我知道使用隱式類可以在典型的scala文件中實現這種語法。這是一種在sbt中完成的方法嗎?

回答

1

是的,這是可能的。在project目錄下創建objectSbtProjectImplicits.scala)(取決於你的項目結構),如:

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) 
+0

謝謝@chengpohi,它像一陣微風,幫助我更好地理解sbt。 – nanarth

相關問題