【问题标题】:SBT sub project access root project data (dependency version)SBT子项目访问根项目数据(依赖版本)
【发布时间】:2017-03-27 22:37:36
【问题描述】:

我有多个 project,我正在我的一个子项目中创建一个带有 git 版本的类。

def iUberdataCoreVersion(version: Option[String] = Some("Not a Git Repository"), dir: File) = {
  val file = dir / "UberdataCoreVersion.scala"
  IO.write(
    file,
    s"""package eleflow.uberdata.core\n  object UberdataCoreVersion{\n          val version = "${version.get}"\n
       val sparkVersion = ${allDependencies.value.filter(_.extraString.startsWith("spark")).head.crossVersion}
             |}\n""".stripMargin)
  Seq(file)
}

依赖项在根项目 build.sbt 文件中定义。我想将 spark 版本(我的依赖项之一)添加到此文件中。有没有办法将参数传递给子项目构建,或者遍历依赖项以发现我使用的是哪个版本的 spark?

在 cmets 中根据需要更新

这里的问题是,在 spark 中有两个版本,在版本 2 中,我可以以与 spark 1 中不同的方式创建它的上下文(以访问 spark 集群)。

root
 build.sbt

lazy val subProject = project settings (libraryDependencies ++= Seq(
    "org.apache.spark" %% "spark-repl" % sparkVersion)

我有 3 个子项目,spark 版本是共享的,所以我是这样配置的,否则我可以将依赖项插入到子项目构建文件中。

考虑 sparkVersion 作为构建参数提供。

root
  sub
    build.sbt

在子项目中,我想创建一个包含 spark 版本的文件。这可以在属性文件或 src 代码文件中完成,就像我对 git 代码所做的那样。创建子项目构建时,我可以将其值作为 val 接收吗?

我可以通过它的上下文访问 spark 版本,它有一个属性,但在这种特定情况下,我想在创建上下文之前这样做,这是我的问题。

【问题讨论】:

  • 您是否要确保您的根项目和子项目使用相同的版本?如果是这样,你可以把版本号放在一个属性文件中,并在每个子项目的 build.sbt 中读取属性文件
  • 或者只是将它们分成另一个文件dependencies.sbt,然后在相应文件中为每个项目选择您需要的那些,换句话说,将所有dep及其版本放在一个地方,然后将它们选为你希望。请注意,根文件夹中的所有.sbt 文件将组合在一起,因此它们可以相互访问(就像它们都在同一个文件中一样)。
  • 您能否用一个示例更新您的问题,展示您的 Scala 代码需要做什么?通常,您在build.sbt 中有对SomeLib_2.11-1.2.3.jar 的依赖,这是您唯一需要说明它是什么版本的地方。在您的 Scala 类中,您只需来自 JAR 的import com.someco.SomeClass,您不需要指定版本。也许我不明白你需要什么
  • @dirceusemighini 这取决于access it from sub project 的含义。正如@radumanolescu 所提到的,您需要更具体。您需要了解代码中的版本吗?这是一个完全不同的问题,与您的项目是子项目这一事实无关。如果你只是想在子项目中使用依赖,答案是肯定的,所有.sbt 文件都可以相互访问。您可以在 sbt docs 上轻松找到示例。
  • 您是否考虑将版本作为 val 写入根项目文件夹中的 Build.scala 中?任何子项目都可以访问。

标签: scala sbt


【解决方案1】:

我们在build.properties 中定义属性并在所有子项目中使用它们。在这种情况下,它是 Scala 版本 - 但它可以是任何字符串。

// ---------- ---------- multiproj/build.properties ---------- ---------- //
scala.version = 2.11.8
// ---------- ---------- multiproj/subproj/build.sbt ---------- ---------- //
val props = SettingKey[Map[String, String]]("props")

props := {
  import scala.collection.JavaConversions._
  val pf = new java.util.Properties()
  IO.load(pf, baseDirectory.value / ".." / "build.properties")
  pf.stringPropertyNames.map(p => p -> Option(System.getProperty(p)).getOrElse(pf.getProperty(p))).toMap
}

libraryDependencies ++= Seq(
  "org.scala-lang" % "scala-library"  % props.value("scala.version") % "compile->*"
, "org.scala-lang" % "scala-compiler" % props.value("scala.version") % "compile->*"
)

【讨论】:

    猜你喜欢
    • 2016-11-29
    • 2018-03-25
    • 2011-08-27
    • 2017-10-17
    • 2018-03-20
    • 2011-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多