【问题标题】:With SBT, how can I have two different proguard tasks with different settings?使用 SBT,我怎样才能拥有两个具有不同设置的不同 proguard 任务?
【发布时间】:2013-06-06 19:52:19
【问题描述】:

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

我正在使用sbt proguard plugin 通过 proguard 运行每个 jar。此插件创建一个名为 proguard 的任务密钥。

我想创建两个任务键,比如proguardAproguardB,它们分别构建了相应的 jar。我已经在 project/Build.scala 中定义了这些任务键。

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

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

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

但是这些都没有生效。

【问题讨论】:

    标签: scala sbt proguard


    【解决方案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。

    【讨论】:

      猜你喜欢
      • 2015-09-26
      • 2014-06-02
      • 1970-01-01
      • 2015-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多