С 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 каждый раз, чтобы избежать попадания в кеш неправильную банку.

Другие вопросы по тегам