#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"
: