scala sbt sbt-assembly

scala - ¿Cómo volver a agregar las dependencias "proporcionadas" para ejecutar/class class de las tareas de prueba?



sbt sbt-assembly (3)

Agregando a @douglaz ''respuesta,

runMain in Compile <<= Defaults.runMainTask(fullClasspath in Compile, runner in (Compile, run))

es la solución correspondiente para la tarea runMain.

Aquí hay un ejemplo build.sbt :

import AssemblyKeys._ assemblySettings buildInfoSettings net.virtualvoid.sbt.graph.Plugin.graphSettings name := "scala-app-template" version := "0.1" scalaVersion := "2.9.3" val FunnyRuntime = config("funnyruntime") extend(Compile) libraryDependencies += "org.spark-project" %% "spark-core" % "0.7.3" % "provided" sourceGenerators in Compile <+= buildInfo buildInfoPackage := "com.psnively" buildInfoKeys := Seq[BuildInfoKey](name, version, scalaVersion, target) assembleArtifact in packageScala := false val root = project.in(file(".")). configs(FunnyRuntime). settings(inConfig(FunnyRuntime)(Classpaths.configSettings ++ baseAssemblySettings ++ Seq( libraryDependencies += "org.spark-project" %% "spark-core" % "0.7.3" % "funnyruntime" )): _*)

El objetivo es tener "spark-core "provided" para que él y sus dependencias no estén incluidos en el artefacto de ensamblaje, sino para incluirlos nuevamente en el classpath en tiempo de ejecución para las tareas relacionadas con la run y la test .

Parece que el uso de un alcance personalizado en última instancia, será útil, pero estoy bloqueado sobre cómo hacer que las tareas de ejecución / prueba globales / predeterminadas usen las libraryDependencies personalizadas y, con un poco de suerte, anule el valor predeterminado. He intentado cosas que incluyen:

(run in Global) := (run in FunnyRuntime)

y cosas por el estilo en vano.

Para resumir: esto se trata esencialmente de una generalización del caso web, donde el servlet-api está en el alcance "provisto", y las tareas de ejecución / prueba generalmente bifurcan un contenedor de servlet que realmente proporciona el servlet-api al código en ejecución. La única diferencia aquí es que no estoy bifurcando en un entorno JVM separado; Solo quiero aumentar manualmente las classpaths de esas tareas, "deshaciendo" efectivamente el alcance "provisto", pero de una manera que continúe excluyendo la dependencia del artefacto de ensamblaje.


Para un caso similar que utilicé en assembly.sbt:

run in Compile <<= Defaults.runTask(fullClasspath in Compile, mainClass in (Compile, run), runner in (Compile, run))

y ahora la tarea ''ejecutar'' usa todas las bibliotecas, incluidas las marcadas con "proporcionado". No fue necesario ningún cambio adicional.


Si usa el plugin sbt-revolver , aquí hay una solución para su tarea "reStart":

fullClasspath in Revolver.reStart <<= fullClasspath in Compile

UPD: para sbt-1.0 puede usar el nuevo formulario de asignación:

fullClasspath in Revolver.reStart := (fullClasspath in Compile).value