首页 > 解决方案 > 如何设置具有继承和共享依赖项的多项目 SBT 项目

问题描述

我想创建一个具有继承和共享依赖项的 SBT 项目。

使用 Maven 的 POM 文件,有项目继承的想法,您可以在其中设置parent项目。我想对 SBT 做同样的事情。

当从父项目编译时,该xchange-stream使用 Maven 的项目继承来解决子项目的依赖关系。

这是我对文件结构的想法:

sbt-project/
  project/
    dependencies.scala    # Contains dependencies common to all projects
  build.sbt               # Contains definition of parent project with references
                          # to subprojects

  subproject1/
    build.sbt             # Contains `subproject3` as a dependency

  subproject2/
    build.sbt             # Contains `subproject3` as a dependency

  subproject3/
    build.sbt             # Is a dependency for `subproject1` and `subproject2`

在哪里project1并且project2可以包含project3在他们的依赖列表中,如下所示:

libraryDependencies ++= "tld.organization" % "project3" % "1.0.0"

这样,当subproject1或通过从其子目录中subproject2调用进行编译时,或者当 parent:从主目录编译时,将使用 SBT 在本地编译和发布,或者以其他方式提供给需要它的项目。sbt compilesbt-projectsbt-projectsubproject3

此外,如何在目录中sbt-project/build.sbt或目录中的任何位置指定共享依赖项,以便在这些子目录中调用时sbt-project/project它们可以在subproject1and中使用?subproject2sbt compile

以下示例无助于回答上述任何一点:

  1. jbruggem/sbt-multiproject-example:使用递归build.sbt文件,但不共享子项目之间的依赖关系。

  2. 使用 sbt 定义多项目构建: pbassiner/sbt-multi-project-example: 对子目录中的项目使用单个build.sbt文件。

  3. sachabarber/SBT_MultiProject_Demo:使用单个build.sbt文件。

标签: sbt

解决方案


这样当subproject1或通过从其子目录中subproject2调用来编译时...sbt compile

也许 Maven 旨在与 shell 环境和cd命令一起使用,但这并不是 sbt 的工作方式,至少从 2019 年的 sbt 1.x 开始。

sbt 方式是sbt用作交互式 shell,并在顶层启动它。然后,您可以调用编译 as subproject1/compile,或使用 切换到它project subproject1,然后compile在那里调用。

房子插件

通过创建自定义插件可以实现类似于父 POM 的功能。

package com.example

import sbt._
import Keys._

object FooProjectPlugin extends AutoPlugin {
  override def requires = plugins.JvmPlugin

  val commonsIo = "commons-io" % "commons-io" % "2.6"

  override def buildSettings: Seq[Def.Setting[_]] = Seq(
    organization := "com.example"
  )
  override def projectSettings: Seq[Def.Setting[_]] = Seq(
    libraryDependencies += commonsIo
  )
}

sbt-sriracha

这并不完全符合您的要求,但我有一个实验性插件,可让您在源依赖和二进制依赖之间切换。使用 sbt-sriracha查看热源依赖项

使用它,您可以创建三个单独的 sbt 构建project1,它们project2project3位于$HOME/workspace目录内。

ThisBuild / scalaVersion     := "2.12.8"
ThisBuild / version          := "0.1.1-SNAPSHOT"

lazy val project3Ref = ProjectRef(workspaceDirectory / "project3", "project3")
lazy val project3Lib = "tld.organization" %% "project3" % "0.1.0"

lazy val project1 = (project in file("."))
  .enablePlugins(FooProjectPlugin)
  .sourceDependency(project3Ref, project3Lib)
  .settings(
    name := "project1"
  )

通过此设置,您可以启动sbt -Dsbt.sourcemode=true,它将选择 project3 作为子项目。


推荐阅读