Несколько банок для нескольких тестовых пакетов в sbt

#sbt #sbt-native-packager #sbt-plugin

#sbt #sbt-native-packager #sbt-плагин

Вопрос:

Есть ли какой-либо способ в sbt (пользовательская задача или плагин) для упаковки пакетов в отдельные банки.

alt

Например: — В этом примере проекта должно быть 6 файлов jar, созданных для пакетов eg1, eg2, eg3, eg4, eg49, eg50

Учитывая, что нет взаимной зависимости какого-либо пакета друг от друга. Упрощенный проект для справки:-https://github.com/moglideveloper/MultipleSpecJars


Окончательное редактирование :-

Мне удалось создать файл jar с именем регулярного выражения (где регулярное выражение указывает на имя некоторого пакета) с помощью задачи ниже :-

 sbt createCompactJar
  

Теперь я застрял, как повторно использовать это для последовательности регулярных выражений.

Ниже приведена упрощенная логика для createCompactJar :-

 lazy val multipleSpecJars = (project in file("."))
  .settings(libraryDependencies  = "org.scalatest" %% "scalatest" % "3.2.2")

//A different configuration which would redefine the packageBin task within this new configuration
//so it does not change the original definition of packageBin
lazy val CompactJar = config("compactJar").extend(Compile)
inConfig(CompactJar)(Defaults.compileSettings)

val allRegexes = List("eg1", "eg2", "eg3", "eg4", "eg49", "eg50")

/*
Below logic only works for one regex (regexToInclude),
How to convert this logic for a sequence of regexes(allRegexes) ?
 */
val regexToInclude = "eg3"

lazy val createCompactJar = taskKey[Unit]("create compact jar based on regex")

/*
createCompactJar
1. Depends on packageBin sbt task.
2. call packageBin and then rename jar that is generated by
   packageBin in same directory to <regex>.jar
 */
createCompactJar := {
  println("now creating jar for regex : "   regexToInclude)
  (packageBin in CompactJar).value

  //Logic to rename generated jar file to <regex>.jar
  val jarFileDir = (baseDirectory).value   "/target/scala-2.12"
  val jarFilePath = jarFileDir   "/multiplespecjars_2.12-0.1.0-SNAPSHOT-compactJar.jar"
  val sourceFile = new File(jarFilePath)
  val destinationFile = new File(jarFileDir   "/"   regexToInclude   ".jar")
  println(s"renaming $sourceFile to $destinationFile")
  sourceFile.renameTo(destinationFile)
}

mappings in(CompactJar, packageBin) := {
  val original = (mappings in(CompactJar, packageBin)).value
  original.filter { case (file, toPath) => toPath.startsWith(regexToInclude) }
}

unmanagedSourceDirectories in CompactJar := (unmanagedSourceDirectories in Compile).value
  

Ответ №1:

Я бы выбрал подпроекты. Я должен признать, что я не совсем понимаю ваш вариант использования (почему вы вообще хотите упаковывать тесты?), Но подпроекты позволяют вам упаковывать вещи независимо друг от друга. Вы даже получаете параллельную компиляцию из коробки, и у вас даже могут быть зависимости между подпроектами, но вам, похоже, они не нужны.

Вот более крупный пример.

Надеюсь, это поможет. Приветствия и счастливого кодирования! 🙂

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

1. Да, я также использую только подпроекты. Но для этого конкретного требования я могу использовать только пакеты.