使用 SBT 构建不同的库版本

问题描述 投票:0回答:2

我正在尝试使用 SBT 构建我的 Scala 源代码,目标是相同Scala 版本,但库版本不同。我的问题是:

  1. SBT 支持这个吗? (似乎不太可能)
  2. 如果没有,有没有办法实现这一点而又不会过多地扰乱构建脚本?

详情: 我正在使用不同版本的 Spark 和其他库构建集群。这似乎是这种场景中的常见用户案例。

我找到的可能解决方案:

  1. 使用Scala的不同次要版本,然后通过交叉构建来调度不同版本的库。非常黑客。
  2. 对多个项目使用虚拟目录,将它们的源路径重定向到真实的源目录。这看起来最有希望,但我还没有尝试过。
scala apache-spark sbt
2个回答
0
投票

没有 sbt 不支持这一点,但如果你想这样做,那么你可以使用着色。 就像如果我想使用由两个不同库支持的两个不同版本的番石榴,然后使用番石榴着色,例如:

    assemblyShadeRules in assembly := Seq(
     ShadeRule.rename("com.google.guava**" -> "shadeio.@1").inAll
    )

0
投票

我解决了这个问题,为不同的 Apache Spark 版本构建 Spark PDF 数据源。

您可以在此处查看示例。

我还为每个版本的 Spark 构建了一些自定义代码:

val sparkVersion = scala.util.Properties.envOrElse("SPARK_VERSION", "3.5.0")

val packageName  =
  sparkVersion match {
    case sparkVersion if sparkVersion.startsWith("3.3") => "spark-pdf-spark33"
    case sparkVersion if sparkVersion.startsWith("3.4") => "spark-pdf-spark34"
    case _ =>  "spark-pdf-spark35"
  }

lazy val common = (project in file("common"))
  .settings(
    name := "common",
    commonSettings
  )
  .disablePlugins(AssemblyPlugin)

lazy val spark35 = (project in file("spark35"))
  .settings(
    name := "spark35",
    commonSettings,
  )
  .disablePlugins(AssemblyPlugin)
  .dependsOn(common)

lazy val spark34 = (project in file("spark34"))
  .settings(
    name := "spark34",
    commonSettings,
  )
  .disablePlugins(AssemblyPlugin)
  .dependsOn(common)

lazy val spark33 = (project in file("spark33"))
  .settings(
    name := "spark33",
    commonSettings,
  )
  .disablePlugins(AssemblyPlugin)
  .dependsOn(common)

lazy val root = (project in file("."))
  .settings(
    name := packageName,
    commonSettings,
  )
  .dependsOn(dependencyModules():_*)
  .aggregate(aggregatedModules(): _*)
© www.soinside.com 2019 - 2024. All rights reserved.