【问题标题】:How to share sbt plugin configuration between multiple projects?如何在多个项目之间共享 sbt 插件配置?
【发布时间】:2015-04-15 18:31:00
【问题描述】:

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

我们还没有弄清楚如何集中插件特定的构建配置。例如,我们将 sbt-assembly 用于我们的一些服务。我们正在调整程序集合并策略,并希望在所有项目中使用它。我们如何重用配置?

另外,我们如何才能自动使某些 sbt 插件可用于我们的所有构建,例如程序集或 scalariform 插件,而不需要手动将其添加到每个构建中?

【问题讨论】:

标签: scala plugins sbt


【解决方案1】:

这是我们想到的自动插件使用模式之一。 自动插件可以依赖 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/main/scala/foo/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 版本等常用库的版本,或排除所有日志库等。

【讨论】:

  • 我无法启用scalastyle-sbt-plugin。我在myplugin\build.sbt #project.settings 中尝试过addSbtPluginmyplugin\src\main\scala\com\me\MyPlugin #buildSettings 中的addSbtPlugin,但没有成功。我不得不复制你的StylePlugin 来激活它。但是这个自定义自动插件不能启用scalastyle-sbt-plugin...你能解释一下它是如何工作的吗?
猜你喜欢
  • 2013-11-12
  • 2012-09-19
  • 2015-08-10
  • 1970-01-01
  • 1970-01-01
  • 2017-05-15
  • 2018-03-18
  • 2012-07-22
  • 1970-01-01
相关资源
最近更新 更多