使用SBT,如何在运行时使用不同的Setting [T]值执行任务?

时间:2012-01-18 02:51:58

标签: scala sbt

在我的项目构建定义中,Android范围中的SettingKey useProguard设置为true。这是我想要的默认值。但是,当我执行一个特定任务时,我希望useProguard为false。 Android范围内的所有内容都来自sbt-android-plugin。

我不确定如何最好地解决这个问题。从我读到的内容看来,命令可以完成工作,因为它可以执行与当前会话看到的状态不同的任务。我试图像这样创建一个这样的命令:

def buildWithoutProguard = Command.command("build-without-proguard") { state =>
  val extracted = Project.extract(state)
  import extracted._

  val transformed = session.mergeSettings :+ (useProguard in Android := false)
  val newStructure = Load.reapply(transformed, structure)
  val newState = Project.setProject(session, newStructure, state)
  Project.evaluateTask(buildAndRun, newState)
  state
}

我将命令附加到我的项目设置,并运行'build-without-proguard'命令根据需要执行buildAndRun任务。但是,useProguard仍然是正确的,而不是我所期望的假。

首先,整个方法对我来说很重要。假设改变sbt-android-plugin不是一个选项,那么我怎么解决这个问题?

其次,为什么这种方法不能正常工作?

1 个答案:

答案 0 :(得分:2)

根据我对您的问题的理解,您希望依赖的设置不同,具体取决于依赖于它的内容。这没有意义 - 依赖性既可以满足也可以不满足,依赖它的依赖性不会出现在等式中。

您的解决方案对我来说似乎很满意。另一种方法是制作两个项目,指向相同的源,但是使用不同的proguard设置和不同的目标,所以一个将构建而另一个没有proguard,并且两者都将保持其状态。然后,您可以随心所欲地切换项目。