2017-08-15 5 views
0

私はいくつかのサブプロジェクトを含む大きなルートの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) 

は、そのような構文を実現することは可能ですか?私は暗黙のクラスを使用して、典型的なスカラーファイルでこの構文を達成することが可能であることを知っています。これらは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

関連する問題