从提供的等动态更改 sbt 构建文件中的库依赖项
dynamically changing library dependencies in sbt build file from provided etc
我们的 Scala 应用程序经常使用 Spark。如果我在本地测试,我的库依赖项是:
libraryDependencies += "org.apache.spark" % "spark-core_2.10" % "1.6.1",
libraryDependencies += "org.apache.spark" % "spark-sql_2.10" % "1.6.1" ,
而我正在构建一个 jar 来部署我使用:
libraryDependencies += "org.apache.spark" % "spark-core_2.10" % "1.6.1" % "provided",
libraryDependencies += "org.apache.spark" % "spark-sql_2.10" % "1.6.1" % "provided",
由于工作的性质,我们有时可能不得不来回翻转几次,同时尝试不同的事情。在某些时候我不可避免地忘记更改构建文件并最终浪费时间,虽然时间不多但足以促使我提出这个问题。
那么,有没有人知道让构建文件根据触发器更新提供的值的方法(不包括记住 'do it right')?例如,也许是读取测试或实时的配置选项?
提前致谢。
我刚刚在我的示例中使用两个不同的 spark 版本执行了动态构建。我需要根据具体情况使用两个不同的版本。
您可以通过两种方式做到这一点。由于您需要以一种或另一种方式提供输入,因此您需要使用命令行参数。
1) 自己使用build.sbt。
a) 您可以定义一个名称为 "sparkVersion"
的参数
b) 在 build.sbt 中读取该参数,(您可以在 build.sbt 中编写 scala 代码,它会在构建时以任何方式编译为 scala。)
c) 如下执行基于条件的依赖。
val sparkVersion = Option(System.getProperty("sparkVersion")).getOrElse("default")
if(sparkVersion == "newer"){
println(" newer one");
libraryDependencies += "org.apache.spark" %% "spark-core" % "1.6.0"
}else{
println(" default one");
libraryDependencies += "org.apache.spark" %% "spark-core" % "1.6.0" % "provided"
}
您可以随意使用所有构建选项。
2) 使用 build.scala 文件。 您可以在 /project/build.scala
中创建一个 build.scala 文件
你可以写下面的代码。
import sbt._
import Keys._
object MyBuild extends Build {
val myOptionValue = Option(System.getProperty("scalaTestVersion")).getOrElse("defaultValue")
val depVersion = if(myOptionValue == "newer"){
println(" asked for newer version" );
"2.2.6"
}else{
println(" asked for older/default version" );
"2.2.0"
}
val dependencies = Seq(
"org.scalatest" %% "scalatest" % depVersion % "test"
)
lazy val exampleProject = Project("SbtExample", file(".")).settings(
version := "1.2",
scalaVersion := "2.10.4",
libraryDependencies ++= dependencies
)
}
在此之后,运行 构建命令如下。
sbt clean compile -DsparkVersion=newer -DscalaTestVersion=newer
我已经给出了两者的构建命令。您可以选择其中一个,也可以只给出一个选项。
如果您需要任何帮助,请写信给我。
为了解决构建中的重复问题,您可以在 build.sbt
中添加以下内容
mergeStrategy in assembly := {
case m if m.toLowerCase.endsWith("manifest.mf") => MergeStrategy.discard
case m if m.toLowerCase.matches("meta-inf.*\.sf$") => MergeStrategy.discard
case "log4j.properties" => MergeStrategy.discard
case "log4j-defaults.properties" => MergeStrategy.discard
case m if m.toLowerCase.startsWith("meta-inf/services/") => MergeStrategy.filterDistinctLines
case "reference.conf" => MergeStrategy.concat
case _ => MergeStrategy.first
}
你会明白 sbt 有多好和神奇。
我们的 Scala 应用程序经常使用 Spark。如果我在本地测试,我的库依赖项是:
libraryDependencies += "org.apache.spark" % "spark-core_2.10" % "1.6.1",
libraryDependencies += "org.apache.spark" % "spark-sql_2.10" % "1.6.1" ,
而我正在构建一个 jar 来部署我使用:
libraryDependencies += "org.apache.spark" % "spark-core_2.10" % "1.6.1" % "provided",
libraryDependencies += "org.apache.spark" % "spark-sql_2.10" % "1.6.1" % "provided",
由于工作的性质,我们有时可能不得不来回翻转几次,同时尝试不同的事情。在某些时候我不可避免地忘记更改构建文件并最终浪费时间,虽然时间不多但足以促使我提出这个问题。
那么,有没有人知道让构建文件根据触发器更新提供的值的方法(不包括记住 'do it right')?例如,也许是读取测试或实时的配置选项?
提前致谢。
我刚刚在我的示例中使用两个不同的 spark 版本执行了动态构建。我需要根据具体情况使用两个不同的版本。
您可以通过两种方式做到这一点。由于您需要以一种或另一种方式提供输入,因此您需要使用命令行参数。
1) 自己使用build.sbt。
a) 您可以定义一个名称为 "sparkVersion"
的参数b) 在 build.sbt 中读取该参数,(您可以在 build.sbt 中编写 scala 代码,它会在构建时以任何方式编译为 scala。)
c) 如下执行基于条件的依赖。
val sparkVersion = Option(System.getProperty("sparkVersion")).getOrElse("default")
if(sparkVersion == "newer"){
println(" newer one");
libraryDependencies += "org.apache.spark" %% "spark-core" % "1.6.0"
}else{
println(" default one");
libraryDependencies += "org.apache.spark" %% "spark-core" % "1.6.0" % "provided"
}
您可以随意使用所有构建选项。
2) 使用 build.scala 文件。 您可以在 /project/build.scala
中创建一个 build.scala 文件你可以写下面的代码。
import sbt._
import Keys._
object MyBuild extends Build {
val myOptionValue = Option(System.getProperty("scalaTestVersion")).getOrElse("defaultValue")
val depVersion = if(myOptionValue == "newer"){
println(" asked for newer version" );
"2.2.6"
}else{
println(" asked for older/default version" );
"2.2.0"
}
val dependencies = Seq(
"org.scalatest" %% "scalatest" % depVersion % "test"
)
lazy val exampleProject = Project("SbtExample", file(".")).settings(
version := "1.2",
scalaVersion := "2.10.4",
libraryDependencies ++= dependencies
)
}
在此之后,运行 构建命令如下。
sbt clean compile -DsparkVersion=newer -DscalaTestVersion=newer
我已经给出了两者的构建命令。您可以选择其中一个,也可以只给出一个选项。 如果您需要任何帮助,请写信给我。
为了解决构建中的重复问题,您可以在 build.sbt
中添加以下内容mergeStrategy in assembly := {
case m if m.toLowerCase.endsWith("manifest.mf") => MergeStrategy.discard
case m if m.toLowerCase.matches("meta-inf.*\.sf$") => MergeStrategy.discard
case "log4j.properties" => MergeStrategy.discard
case "log4j-defaults.properties" => MergeStrategy.discard
case m if m.toLowerCase.startsWith("meta-inf/services/") => MergeStrategy.filterDistinctLines
case "reference.conf" => MergeStrategy.concat
case _ => MergeStrategy.first
}
你会明白 sbt 有多好和神奇。