4

我有一个源代码树,我可以从中构建两个不同的 jar;称他们为 JarA 和 JarB。

我正在使用sbt proguard 插件通过 proguard 运行每个 jar。这个插件创建了一个名为proguard.

我想制作两个任务键,比如proguardAproguardB,分别构建各自的罐子。我在 project/Build.scala 中定义了这些任务键。

但是,如何为每个任务使用一组不同的 proguard 选项?也就是说,我怎样才能为设置使用不同的值proguardOptions

我尝试了任务范围设置的各种排列,例如

proguardA <<= proguard in proguardA
proguardSettings in (proguard in proguardA) <<= ...
proguardSettings in proguardA <<= ...

ETC

但这些都没有生效。

4

1 回答 1

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依赖proguardaproguard in ProguardA. 此外,您必须每次更改minJarPath或运行clean以避免缓存拾取错误的 jar。

于 2013-08-22T17:16:03.083 回答