8

我有多个 SBT 项目,它们都有一个共同的设置 - 例如多模块、publishTo 设置等。

我如何提供每个项目都可以从中扩展的通用例如 CommonBuild 类?例如:

trait CommonBuild {
  val publishSettings = Seq(
    publishTo := Some("", ""),
    credentials += ...
  )

  def module(name: String) (
    settings: Seq[Setting[_]],
    projectId: String = PROJECT + "-" + name,
    dirName: String = name,
    srcPath: String = PROJECT + name
    ) = Project(projectId, file(dirName), settings = (buildSettings ++ srcPathSetting(projectId, srcPath)) ++ publishSettings ++ settings)

}

现在它可以被项目构建使用:

object ProjABuild extends CommonBuild {
   // use CommonBuild methods / vals
}

object ProjBBuild extends CommonBuild {
   // use CommonBuild methods / vals
}
4

1 回答 1

3

我也想这样做。重要的是,公共设置需要存在于子项目所依赖的自己的项目中,以便对公共设置所做的更改自动在所有子项目中生效。实现这一点的唯一方法是将常用的东西放在 SBT 插件中。

我写了这样一个插件,叫做iesl-sbt-base。它提供了一堆样板文件,因此您项目的 Build.scala 文件可以非常简短。它提供:

  • 解析器配置
  • 通过自动更新简化依赖关系解析
  • 明确使用了哪些传递依赖项
  • 快照版本的可选保护
  • 清理日志记录配置

有关详细信息,请参阅https://github.com/iesl/iesl-sbt-base。您可能想要分叉以更改特定于我的设置的内容(例如,特别是解析器 URL)。如果有需求,我可以考虑如何使其更具可配置性。

于 2012-10-03T14:47:38.083 回答