scala - Is it possible to extend build.sbt syntax using implicit classes? -
i have big root sbt project contains several sub-projects. among project definitions there lot of code duplication trying remove.
for example every assembly project contains following code:
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 } ) instead write that:
project .assembly(classname, jarname) is possible achieve such syntax? know possible achieve syntax in typical scala file using implicit class. these way in sbt ?
yes, it's possible. create object(sbtprojectimplicits.scala) under project directory(depend on project structure), like:
your-project/ project/sbtprojectimplicits.scala src/ ... and sbtprojectimplicits.scala object content maybe like:
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 } } } so can in build.sbt like:
import sbtprojectimplicits._ project .assembly(classname, jarname)
Comments
Post a Comment