sbt - 如何设置具有继承和共享依赖项的多项目 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 compile
sbt-project
sbt-project
subproject3
此外,如何在目录中sbt-project/build.sbt
或目录中的任何位置指定共享依赖项,以便在这些子目录中调用时sbt-project/project
它们可以在subproject1
and中使用?subproject2
sbt 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
命令一起使用,但这并不是 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
,它们project2
都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"
)
通过此设置,您可以启动sbt -Dsbt.sourcemode=true
,它将选择 project3 作为子项目。
推荐阅读
- android - 系统完整性调用错误。907135701
- html - 使文本输入在引导程序中的卡片中采用 12 col
- python - Django 如何从模板中的查询集中获取查询集
- sql-server - 从查询中提取数据到变量
- flutter - Dart 中的嵌套 Map 操作
- amazon-web-services - 亚马逊短信发送状态和收到的短信
- javascript - 切换显示/隐藏元素,其中默认刷新为隐藏
- android - 没有构建器可用于构建“org.jetbrains.plugins.gradle.model.internal.DummyModel”类型的模型
- go - 停止 goroutine 在 bufio.NewScanner 上等待
- socat - 使用 Socat 监听多个端口(端口范围)