首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在SBT中的多模块项目中将scala非交叉发布的库隔离在单独的模块中

在SBT中的多模块项目中将scala非交叉发布的库隔离在单独的模块中
EN

Stack Overflow用户
提问于 2022-01-24 16:39:45
回答 1查看 63关注 0票数 0

这是一个恼人的问题,但我需要一个scala库,用于一个只为2.12发布的大型项目。理想情况下,我会将这个库隔离到它自己的模块中,这样就不会强迫整个项目处于scala 2.12中,因为最终这个项目需要在scala3中。有没有一种方法可以让多模块sbt项目允许Scala2.12项目依赖于scala3项目,或者与不同的scala版本共存?

到目前为止,这大致是我所拥有的(下面的例子实际上使用的是2.13.8,但想法应该是相同的):

代码语言:javascript
复制
lazy val scala213 = "2.13.8"
lazy val scala212 = "2.12.15"

lazy val supportedScalaVersions = List(scala212, scala213)

val Versions = 
  new {
    val parser = "9.0.20210312"
    val catseffect = "3.3.3"
}

val commonSettings = Seq(
  scalacOptions -= "-Xfatal-warnings"
)

def full(p: Project) = p % "test->test;compile->compile"

lazy val cypherparser = (project in file("modules/cypherparser"))
  .settings(
    scalaVersion := scala212,
    crossScalaVersions := supportedScalaVersions,
    libraryDependencies ++= Seq(
      "org.opencypher" % "parser-9.0" % Versions.parser
    )
  ).dependsOn(shared)

lazy val shared = (project in file("modules/shared"))
  .settings(
    scalaVersion := scala213,
    crossScalaVersions := supportedScalaVersions,
    commonSettings,
    libraryDependencies ++= Seq(
      "org.typelevel" %% "cats-effect" % Versions.catseffect,
      "org.typelevel" %% "munit-cats-effect-3" % "1.0.7" % Test,
    )
  )

lazy val root = (project in file("."))
  .aggregate(shared, cypherparser)
  .settings(
    crossScalaVersions := Nil,
    publish / skip := false
  )

运行上面我得到

代码语言:javascript
复制
sbt.librarymanagement.ResolveException: Error downloading shared:shared_2.12:0.1.0-SNAPSHOT
EN

回答 1

Stack Overflow用户

发布于 2022-01-24 18:31:06

因此,在评论讨论之后,我决定交叉构建我的共享模块,这样cypherparser就可以依赖它了。但是我发现了sbt-projectmatrix插件,并使用以下方法进行了一些实验

代码语言:javascript
复制
ThisBuild / version      := "0.1.0-SNAPSHOT"

lazy val scala213 = "2.13.8"
lazy val scala212 = "2.12.15"

val Versions = 
  new {
    val parser = "9.0.20210312"
    val catseffect = "3.3.3"
}

val commonSettings = Seq(
  scalacOptions -= "-Xfatal-warnings"
)

def full(p: Project) = p % "test->test;compile->compile"

lazy val cypherparser = (projectMatrix in file("modules/cypherparser"))
  .dependsOn(shared)
  .settings(
    libraryDependencies ++= Seq(
      "org.opencypher" % "parser-9.0" % Versions.parser
    )
  )
  .jvmPlatform(scalaVersions = Seq(scala212))

lazy val shared = (projectMatrix in file("modules/shared"))
  .settings(
    commonSettings,
    libraryDependencies ++= Seq(
      "org.typelevel" %% "cats-effect" % Versions.catseffect,
      "org.typelevel" %% "munit-cats-effect-3" % "1.0.7" % Test,
    )
  )
  .jvmPlatform(scalaVersions = Seq(scala212, scala213))

lazy val root = (project in file("."))
  // .aggregate(cypherparser)
  .aggregate(shared.projectRefs ++ cypherparser.projectRefs: _*)
  .settings(
    publish / skip := false
  )

..。我可以像我想的那样依赖shared。神奇的是,我还可以使用不同的版本来aggregate这些模块(仍然不太确定这是如何/为什么工作的,我只是遵循了文档)。注意:您不能在设置中使用scalaVersion,否则这会破坏事情--只在platform声明中声明scala版本。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70837312

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档