С SBT, как я могу иметь две разные задачи Proguard с разными настройками?
У меня есть одно исходное дерево, из которого я мог бы построить два разных jar-файла; называть их JarA и JarB.
Я использую плагин sbt proguard для запуска каждой банки через proguard. Этот плагин создает ключ задачи под названием proguard
,
Я хотел бы сделать две клавиши задач, скажем, proguardA
а также proguardB
, что построить соответствующие банки. Я определил эти ключи задач в проекте /Build.scala.
Но как мне использовать разные наборы параметров Proguard для каждой задачи? То есть, как я могу использовать другое значение для настройки proguardOptions
?
Я пробовал различные варианты настроек области задач, таких как
proguardA <<= proguard in proguardA
proguardSettings in (proguard in proguardA) <<= ...
proguardSettings in proguardA <<= ...
так далее
Но ни один из них не вступил в силу.
1 ответ
Есть несколько способов сделать скин для этого кота, но я бы определил две конфигурации в build.scala:
val ProguardA = config("proguarda") extend(Compile)
val ProguardB = config("proguardb") extend(Compile)
Это позволит вам иметь целый набор настроек за пределами Compile
, Поскольку xsbt-proguard-plugin в настоящее время жестко кодирует опцию Compile
конфигурации, нам нужно исправить proguard
задача.
import sbt._
import Keys._
import ProguardPlugin._
object Builds extend Build {
val ProguardA = config("proguarda") extend(Compile)
val ProguardB = config("proguardb") extend(Compile)
val xProguardArgs = TaskKey[List[String]]("x-proguard-args")
val appSettings = Defaults.defaultSettings ++
inConfig(ProguardA)(proguardSettings ++ Seq(
proguard <<= (packageBin in Compile, xProguardArgs, baseDirectory) map { (_, args, bd) => proguardTask(args, bd) },
xProguardArgs <<= proguardArgsTask,
proguardOptions := Seq(keepMain("Test"))
)) ++
inConfig(ProguardB)(proguardSettings ++ Seq(
proguard <<= (packageBin in Compile, xProguardArgs, baseDirectory) map { (_, args, bd) => proguardTask(args, bd) },
xProguardArgs <<= proguardArgsTask,
proguardOptions := Seq(keepAllScala),
minJarPath <<= (crossTarget, projectID, artifact, scalaVersion, artifactName) { (t, module, a, sv, toString) => t / toString(ScalaVersion(sv, CrossVersion binaryScalaVersion sv), module.copy(revision = module.revision + ".min-b"), a) asFile }
)) ++
Seq(
// name := "foo",
// libraryDependencies ++= appDependencies
)
lazy val app = Project("app", file("."), settings = appSettings)
}
Теперь вы можете запустить его как proguarda:proguard
или сделать задачу proguarda
это зависит от proguard in ProguardA
, Также вы должны изменить minJarPath
или беги clean
каждый раз, чтобы избежать попадания в кеш неправильную банку.