如何在多个项目之间共享sbt插件配置?

时间:2015-02-14 22:56:41

标签: scala plugins sbt

我们有许多较小的sbt项目,我们希望将它们分开(没有多项目构建)。但是,我们希望在构建之间共享配置。为了做到这一点,我们目前还有另一个项目,所有项目都在项目/项目/ Build.scala文件中用作库依赖项。我们只能使用内置的sbt功能集中构建配置。

我们还没想到的是如何集中插件特定的构建配置。例如,我们对我们的几个服务使用sbt-assembly。我们正在调整程序集mergeStrategy,并希望在所有项目中使用它。我们如何重新使用配置?

另外,我们如何自动为我们的所有版本提供某些sbt-plugins,例如汇编或标量插件,而无需手动将其添加到每个版本中?

1 个答案:

答案 0 :(得分:13)

这是我们为自动插件考虑的使用模式之一。 自动插件可以依赖于sbt-assembly或sbt-scalariform,并自动将设置引入所有项目。

build.sbt

sbt-your-company可以在build.sbt中包含sbt-scalariform作为库依赖项,如下所示:

lazy val commonSettings = Seq(
  organization := "com.example",
  version := "0.1.0"
)

lazy val root = (project in file(".")).
  settings(
    commonSettings ++
    addSbtPlugin("com.typesafe.sbt" % "sbt-scalariform" % "1.3.0")
  : _*).
  settings(
    sbtPlugin := true,
    name := "sbt-your-company",
    // other settings here
  )

由于addSbtPlugin(...)通常只出现在project/plugins.sbt中,这可能有点奇怪,但是如果你看一下addSbtPlugin的实现基本上是libraryDependencies,只有一些额外的属性:

def addSbtPlugin(dependency: ModuleID): Setting[Seq[ModuleID]] =
  libraryDependencies <+= (sbtBinaryVersion in update, scalaBinaryVersion in update) { (sbtV, scalaV) => sbtPluginExtra(dependency, sbtV, scalaV) }

的src /主/阶/富/ houserules / FormatPlugin.scala

自动插件添加的功能之一是能够基于其他插件触发插件。通过基于plugins.JvmPlugin触发插件,您可以有效地创建默认启用的插件。这是一个名为FormatPlugin的示例插件:

package foo
package houserules

import sbt._
import Keys._
import com.typesafe.sbt.SbtScalariform.{ ScalariformKeys => sr, _ }

object FormatPlugin extends AutoPlugin {
  override def requires = plugins.JvmPlugin
  override def trigger = allRequirements

  override def projectSettings: Seq[Def.Setting[_]] = baseSettings

  lazy val baseSettings: Seq[Setting[_]] = scalariformSettings ++ Seq(
    sr.preferences := formatPrefs
  )

  def formatPrefs = {
    import scalariform.formatter.preferences._
    FormattingPreferences().setPreference(AlignSingleLineCaseStatements, true)
  }
}

此插件引入了sbt-scalariform的scalariformSettings和自定义格式首选项。

使用

您所要做的就是将sbt-your-company包含在您的构建中。 如果您的某个项目想要选择退出FormatPlugin,则可以使用disablePlugins(...)。请参阅Using plugins

完整示例,另请参阅我刚刚创建的sbt-houserules。 (巧合的是,我一直想为sbt模块化创造这个。)

内部插件的其他用法

您还可以使用自动插件来配置其他内容,例如Akka版本的公共库版本,或者排除所有日志记录库等。