#sbt #sbt-native-packager #sbt-plugin
#sbt #sbt-native-packager #sbt-плагин
Вопрос:
Есть ли какой-либо способ в sbt (пользовательская задача или плагин) для упаковки пакетов в отдельные банки.
Например: — В этом примере проекта должно быть 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. Да, я также использую только подпроекты. Но для этого конкретного требования я могу использовать только пакеты.