我想创建一个具有继承和共享依赖关系的SBT项目。
使用Maven的POM文件时,可以使用“ 项目继承”的思想来设置parent项目。我想对SBT做同样的事情。
从父项目编译时,xchange-stream库使用Maven的Project Inheritance来解决子项目的依赖关系。
这是我对文件结构的看法:
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`
Run Code Online (Sandbox Code Playgroud)
在哪里project1和project2可包括project3在它们的依赖这样的名单:
libraryDependencies ++= "tld.organization" % "project3" % "1.0.0"
Run Code Online (Sandbox Code Playgroud)
这样,当从子目录中调用subproject1或subproject2编译sbt compile时,或sbt-project从主sbt-project目录编译parent:时,subproject3将使用SBT在本地进行编译和发布,或者以其他方式提供给需要它的项目。
另外,如何sbt-project/build.sbt在sbt-project/project目录中或目录中的任何地方指定共享的依赖关系,以便在这些子目录中调用时可以在subproject1和中使用它们?subproject2sbt compile
以下示例无法帮助您回答以上几点:
jbruggem/sbt-multiproject-example:使用递归build.sbt文件,但不共享子项目之间的依赖关系。
定义多项目,SBT构建:pbassiner/sbt-multi-project-example:使用一个单一的build.sbt文件在其子目录中的项目。
sachabarber/SBT_MultiProject_Demo:使用单个build.sbt文件。
这样当
subproject1或通过从其子目录中subproject2调用进行编译时......sbt compile
也许 Maven 应该与 shell 环境和cd命令一起使用,但至少从 2019 年的 sbt 1.x 开始,sbt 并不是这样工作的。
sbt 方式是用作sbt交互式 shell,并在顶层启动它。然后,您可以将编译调用为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
)
}
Run Code Online (Sandbox Code Playgroud)
这并不完全是您所要求的,但我有一个实验性插件,可以让您在源依赖项和二进制依赖项之间切换。使用 sbt-sriracha查看热源依赖项。
project1使用它,您可以为、project2和创建三个单独的 sbt 版本project3,所有版本都位于$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"
)
Run Code Online (Sandbox Code Playgroud)
通过此设置,您可以启动sbt -Dsbt.sourcemode=true并且它将选择 project3 作为子项目。