【问题标题】:sbt cross project, shared dependencies for test examplesbt 跨项目,测试示例的共享依赖项
【发布时间】:2017-08-09 00:57:49
【问题描述】:

我有一个小的project

我有以下问题:

scalaTest 需要添加到所有三个依赖项项目(clientservershared)中,否则所有项目都无法访问 scalatest 库。

换句话说,如果我写

 val jvmDependencies = Def.setting(Seq(
   "org.scalaz" %% "scalaz-core" % "7.2.8"
 )++scalaTest)

然后一切正常。

但是如果我不将++scalaTest 写入每三个依赖项中,那么它会像这样失败:

> test
[info] Compiling 1 Scala source to /Users/joco/tmp3/server/target/scala-2.11/test-classes...
[error] /Users/joco/tmp3/server/src/test/scala/Test.scala:1: object specs2 is not a member of package org
[error] import org.specs2.mutable.Specification
[error]            ^
[error] /Users/joco/tmp3/server/src/test/scala/Test.scala:3: not found: type Specification
[error] class Test extends Specification {
[error]                    ^
[error] /Users/joco/tmp3/server/src/test/scala/Test.scala:5: value should is not a member of String
[error]   "Test" should {
[error]          ^
[error] /Users/joco/tmp3/server/src/test/scala/Test.scala:6: value in is not a member of String
[error]     "one is one" in {
[error]                  ^
[error] /Users/joco/tmp3/server/src/test/scala/Test.scala:8: value === is not a member of Int
[error]       1===one
[error]        ^
[error] 5 errors found
[error] (server/test:compileIncremental) Compilation failed
[error] Total time: 4 s, completed Mar 18, 2017 1:56:54 PM

但是对于生产(非测试)代码,一切正常:如果我想在所有三个项目中使用一个库,我不必向所有三个项目添加 3 倍相同的依赖项(在此示例中为 autowire)项目,只需将其添加到 shared 项目中就足够了,然后我可以从所有三个项目中使用该库。

然而,对于测试代码,正如我上面提到的,目前我必须向所有三个项目添加相同的库依赖项(scalaTest - 下面)

问题:有没有办法避免这种情况?

Settings.scala:

import org.scalajs.sbtplugin.ScalaJSPlugin.autoImport._
import sbt.Keys._
import sbt._

object Settings {
  val scalacOptions = Seq(
    "-Xlint",
    "-unchecked",
    "-deprecation",
    "-feature",
    "-Yrangepos"
  )

  object versions {
    val scala = "2.11.8"
  }

   val scalaTest=Seq(
      "org.scalatest" %% "scalatest" % "3.0.1" % "test",
     "org.specs2" %% "specs2" % "3.7" % "test")

   val sharedDependencies = Def.setting(Seq(
    "com.lihaoyi" %%% "autowire" % "0.2.6"
  )++scalaTest)

 val jvmDependencies = Def.setting(Seq(
   "org.scalaz" %% "scalaz-core" % "7.2.8"
 ))

  /** Dependencies only used by the JS project (note the use of %%% instead of %%) */
  val scalajsDependencies = Def.setting(Seq(
    "org.scala-js" %%% "scalajs-dom" % "0.9.1"
  )++scalaTest)
}

build.sbt:

import sbt.Keys._
import sbt.Project.projectToRef
import webscalajs.SourceMappings

lazy val shared = (crossProject.crossType(CrossType.Pure) in file("shared")) .settings(
    scalaVersion := Settings.versions.scala,
    libraryDependencies ++= Settings.sharedDependencies.value,
    addCompilerPlugin("org.scalamacros" % "paradise" % "2.1.0" cross CrossVersion.full)
) .jsConfigure(_ enablePlugins ScalaJSWeb)

lazy val sharedJVM = shared.jvm.settings(name := "sharedJVM")

lazy val sharedJS = shared.js.settings(name := "sharedJS")

lazy val elideOptions = settingKey[Seq[String]]("Set limit for elidable functions")

lazy val client: Project = (project in file("client"))
  .settings(
    scalaVersion := Settings.versions.scala,
    scalacOptions ++= Settings.scalacOptions,
    libraryDependencies ++= Settings.scalajsDependencies.value,
    testFrameworks += new TestFramework("utest.runner.Framework")
  )
  .enablePlugins(ScalaJSPlugin)
  .disablePlugins(RevolverPlugin)
  .dependsOn(sharedJS)

lazy val clients = Seq(client)

lazy val server = (project in file("server")) .settings(
    scalaVersion := Settings.versions.scala,
    scalacOptions ++= Settings.scalacOptions,
    libraryDependencies ++= Settings.jvmDependencies.value
  )
  .enablePlugins(SbtLess,SbtWeb)
  .aggregate(clients.map(projectToRef): _*)
  .dependsOn(sharedJVM)

onLoad in Global := (Command.process("project server", _: State)) compose (onLoad in Global).value
fork in run := true
cancelable in Global := true

【问题讨论】:

  • 你能最小化你的例子吗?似乎有很多代码与您要解决的问题无关。如果您的示例很小,它可以更轻松地帮助您(因此您更有可能得到答案)。
  • 嗨,我把简化的放在这里:github.com/jhegedus42/sbt-shared-skeleton-test-bug
  • 也更新了问题。

标签: scala sbt scalatest scala.js


【解决方案1】:

然而,对于测试代码,正如我上面提到的,目前我必须向所有三个项目添加相同的库依赖项(scalaTest - 下面)。

这是意料之中的。 test 依赖不会沿依赖链继承。这是有道理的,因为您不想仅仅因为您依赖一个恰好使用 JUnit 测试的库而依赖 JUnit。

虽然是的,但是当您在同一个版本中有多个项目时,这需要一些重复,所有项目都使用相同的测试框架。这就是为什么我们经常会发现一些 commonSettings 添加到 sbt 构建的所有项目中的原因。这也是我们通常将organizationscalaVersion 之类的内容以及通常适用于一个构建中的所有项目的许多其他设置的地方。

【讨论】:

    猜你喜欢
    • 2015-12-12
    • 2018-07-14
    • 2013-06-15
    • 1970-01-01
    • 2012-01-01
    • 2016-02-18
    • 2018-03-20
    • 1970-01-01
    • 2015-11-02
    相关资源
    最近更新 更多