40

例を次に示し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"
  )): _*)

目標は、spark-core"provided"を使用して、それとその依存関係がアセンブリ アーティファクトに含まれないようにすることですが、run- および -test関連タスクのランタイム クラスパスにそれらを再インクルードすることです。

カスタム スコープを使用すると最終的には役立つようですが、実際にデフォルト/グローバル実行/テスト タスクでカスタム スコープを使用しlibraryDependencies、できればデフォルトをオーバーライドする方法がわかりません。私は次のことを試しました:

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

などは駄目です。

要約すると、これは本質的に、servlet-api が「提供された」スコープにあり、実行/テスト タスクが実際に実行中のコードに servlet-api を提供するサーブレット コンテナをフォークする Web ケースの一般化のように感じます。ここでの唯一の違いは、別の JVM/環境をフォークしていないことです。これらのタスクのクラスパスを手動で拡張し、「提供された」スコープを効果的に「元に戻す」ことを望んでいますが、アセンブリ成果物から依存関係を引き続き除外する方法で行います。

4

4 に答える 4

49

assembly.sbt で使用した同様のケース:

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

そして今、「実行」タスクは、「提供」とマークされたものを含むすべてのライブラリを使用します。それ以上の変更は必要ありませんでした。

アップデート:

@rob ソリューションは、最新の SBT バージョンで動作する唯一のソリューションのようsettingsですbuild.sbt

run in Compile := Defaults.runTask(fullClasspath in Compile, mainClass in (Compile, run), runner in (Compile, run)).evaluated,
runMain in Compile := Defaults.runMainTask(fullClasspath in Compile, runner in(Compile, run)).evaluated
于 2014-02-15T20:45:12.877 に答える
14

@douglazの回答に追加すると、

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

runMain タスクの対応する修正です。

于 2014-05-22T07:30:53.203 に答える
2

プラグインを使用する場合sbt-revolver、「reStart」タスクの解決策は次のとおりです。

fullClasspath in Revolver.reStart <<= fullClasspath in Compile

UPD: sbt-1.0 の場合、新しい割り当てフォームを使用できます:

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

于 2015-01-28T19:28:10.547 に答える