如何在多个项目之间共享 sbt 插件配置?
How to share sbt plugin configuration between multiple projects?
我们有许多较小的 sbt 项目,我们希望将它们分开(没有多项目构建)。但是,我们希望在构建之间共享配置。为了做到这一点,我们目前还有另一个项目,所有项目都将其用作 project/project/Build.scala 文件中的 libraryDependency。通过这种方式,我们能够仅使用内置的 sbt 功能来集中构建配置。
我们还没有弄清楚的是如何集中插件特定的构建配置。例如,我们将 sbt-assembly 用于我们的几个服务。我们正在调整程序集 mergeStrategy 并希望在所有项目中使用它。我们如何重新使用配置?
另外,我们如何才能自动使某些 sbt 插件可用于我们所有的构建,例如程序集或 scalariform 插件,而无需手动将其添加到每个构建中?
这是我们为自动插件考虑的使用模式之一。
自动插件可以依赖 sbt-assembly 或 sbt-scalariform 并自动将设置引入所有项目。
build.sbt
sbt-your-company 可以包含 sbt-scalariform 作为库依赖项,如下 build.sbt
:
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 版本,或者排除所有日志库等。
我们有许多较小的 sbt 项目,我们希望将它们分开(没有多项目构建)。但是,我们希望在构建之间共享配置。为了做到这一点,我们目前还有另一个项目,所有项目都将其用作 project/project/Build.scala 文件中的 libraryDependency。通过这种方式,我们能够仅使用内置的 sbt 功能来集中构建配置。
我们还没有弄清楚的是如何集中插件特定的构建配置。例如,我们将 sbt-assembly 用于我们的几个服务。我们正在调整程序集 mergeStrategy 并希望在所有项目中使用它。我们如何重新使用配置?
另外,我们如何才能自动使某些 sbt 插件可用于我们所有的构建,例如程序集或 scalariform 插件,而无需手动将其添加到每个构建中?
这是我们为自动插件考虑的使用模式之一。 自动插件可以依赖 sbt-assembly 或 sbt-scalariform 并自动将设置引入所有项目。
build.sbt
sbt-your-company 可以包含 sbt-scalariform 作为库依赖项,如下 build.sbt
:
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 版本,或者排除所有日志库等。