使用 SBT,我怎样才能拥有两个具有不同设置的不同 proguard 任务?
Posted
技术标签:
【中文标题】使用 SBT,我怎样才能拥有两个具有不同设置的不同 proguard 任务?【英文标题】:With SBT, how can I have two different proguard tasks with different settings? 【发布时间】:2013-06-06 19:52:19 【问题描述】:我有一个单一的源代码树,我可以从中构建两个不同的 jar;称它们为 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 <<= ...
等
但是这些都没有生效。
【问题讨论】:
【参考方案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
运行,或者创建一个依赖于proguard in ProguardA
的任务proguarda
。此外,您必须每次更改 minJarPath
或运行 clean
以避免缓存拾取错误的 jar。
【讨论】:
以上是关于使用 SBT,我怎样才能拥有两个具有不同设置的不同 proguard 任务?的主要内容,如果未能解决你的问题,请参考以下文章
具有一个日期和三个不同值的数据框:我怎样才能得到中间的那个?
我怎样才能有两个具有相同功能的 goroutine 来查看彼此的值?