Библиотека Scala, доступная как при компиляции, так и при тестировании конфигурации

#scala #sbt

#scala #sbt

Вопрос:

У меня есть библиотека, которую я хочу использовать как в модульных тестах в Scala, так и в самом коде.

В sbt я добавил зависимость моей библиотеки от конфигурации "test" , и затем она доступна для тестов, но я не могу использовать ее в коде. Если я оставлю конфигурацию «Быть» или «добавить "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" , но это также не дает того, на что я надеялся…

Ответ №1:

Вы можете комбинировать конфигурации. Чтобы иметь библиотеку как для компиляции, так и для тестирования, вы просто добавляете конфигурации бота.

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

Синтаксис примерно означает: конфигурация проекта зависит от (->) конфигурации libraryDependency.

Обновить

Вы также можете добавить зависимость дважды с разными конфигурациями.

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

Обновление 2

Я думаю, что синтаксис в первом примере — это не то, что я хотел предоставить.

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

По крайней мере, это то, что я использую в своей libraryDependencies .

Комментарии:

1. Когда я это делаю, я получаю Configurations already specified for module org.scalacheck:scalacheck:1.14.0:compile->compile . Я тоже пробовал % "compile" % "test" , но это дает мне то же самое.

2. Что означает удаленная / локальная конфигурация в этом контексте? Мне удалось заставить ее работать с помощью простого "compile;test" для библиотек, которые должны быть в обеих. Это не сработало со стрелками.

3. Я обновил ответ (надеюсь) более четкой формулировкой. Imo расширенный синтаксис compile->compile более выразителен. Однако вы правы, это действительно нужно только в том случае, если требуется что-то более экзотическое (например, если задействованы нестандартные конфигурации или кто-то хотел бы compile зависеть от тестового кода зависимости ‘compile-> test’ (странно, но случается).).

Ответ №2:

Итак, вам нужна черта из Scalatest JAR в нетестовом коде. Я не уверен, почему это работало раньше, но для меня имело бы смысл просто удалить % "test" из зависимости scalatest. Это сделает ее доступной в compile , и все, что из compile , также доступно в test .

И для Scalactic я думаю, что основной вариант использования ее в качестве отдельной зависимости — это когда вам это нужно в compile , но используйте только Scalatest в test (или не используйте его вообще). Если они оба необходимы только для тестов (или для компиляции), Scalatest предоставит Scalactic.

Я попробовал «test-> compile», но это также не дает того, на что я надеялся…

"test->compile" совпадает с "test" :

Конфигурация без сопоставления (no "->" ) сопоставляется с "default" или "compile" . -> Требуется только при сопоставлении с конфигурацией, отличной от этих.