Scala库在编译和测试配置中均可用

时间:2019-03-07 15:27:51

标签: scala sbt

我有一个库,希望在Scala的单元测试和代码本身中公开。

在sbt中,我使用配置"test"添加了我的库依赖项,然后它可以用于测试,但是我不能在代码中使用它。如果我保留配置为be或添加"compile",则无法在单元测试中将其导入。

libraryDependencies ++= Seq(
  "org.scalacheck" %% "scalacheck" % "1.14.0",
  "org.scalatest" %% "scalatest" % "3.0.6" % "test",
  "org.scalactic" %% "scalactic" % "3.0.6" % "test")

主要问题是,我在其他代码abstract class UnitSpec extends FlatSpec with Matchers with ScalaCHeckDrivenPropertyChecks中公开了一个我想在各处使用的抽象类,并在该库的测试中使用了它。如果我将"test"添加到ScalaCheck,则无法在库的主代码中找到它。如果我保持原样,则不能从org.scalatestplus.scalacheck.ScalaCheckDrivenPropertyChecks开始。过去还可以,并且可以在3.0.5和GeneratorDrivenProperyChecks上正常工作,但是已经过时了。

有没有办法实现我想要的?我尝试了"test->compile",但这也没有达到我的期望……

2 个答案:

答案 0 :(得分:2)

您可以组合配置。为了使库能够同时进行编译和测试,您只需添加bot配置。

// wrong: libraryDependencies += "<organization>" %% "<module>"  % "<version>" % "compile->compile" % "test->compile"

语法大致意思是:项目配置 dependsOn(->) libraryDependency的配置

更新

您还可以使用不同的配置将依赖项添加两次。

libraryDependencies += "<organization>" %% "<module>"  % "<version>",
libraryDependencies += "<organization>" %% "<module>"  % "<version>" % "test"

更新2

我认为第一个示例中的语法不是我想要提供的。

libraryDependencies += "<organization>" %% "<module>"  % "<version>" % "compile->compile;test->compile"

至少这是我在libraryDependencies中使用的语言。

答案 1 :(得分:0)

因此,您需要非测试代码中Scalatest JAR的特征。我不确定为什么它以前能起作用,但是对我来说,仅仅从最严格的依赖项中删除% "test"就有意义。这将使其在compile中可用,并且compile中的所有内容也都在test中可用。

对于Scalactic,我认为将其作为单独的依赖项的主要用例是在compile中需要它,而仅在test中使用Scalatest(或者根本不使用它) 。如果只有测试(或编译)都需要它们,Scalatest会带来Scalactic。

  

我尝试了“测试->编译”,但这也没有实现我希望的...

"test->compile""test"相同:

  
    

A configuration without a mapping (no "->") is mapped to "default" or "compile". The -> is only needed when mapping to a different configuration than those.