我有一个单一的源树,我可以从中构建两个不同的罐子;称他们为JarA和JarB。
我正在使用sbt proguard plugin通过proguard运行每个jar。此插件创建一个名为proguard
的任务键。
我想制作两个任务键,比如proguardA
和proguardB
,它们构建了相应的jar。我在project / Build.scala中定义了这些任务键。
但是,如何为每项任务使用一组不同的proguard选项?也就是说,如何为设置proguardOptions
?
我尝试了各种任务范围设置的排列,例如
proguardA <<= proguard in proguardA
proguardSettings in (proguard in proguardA) <<= ...
proguardSettings in proguardA <<= ...
等
但这些都没有生效。
答案 0 :(得分: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
以避免缓存拾取错误的jar。