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

Scala 使用SBT,如何在运行时使用不同的设置[T]值执行任务?,scala,sbt,Scala,Sbt,在我的项目构建定义中,Android作用域中的SettingKey useProguard设置为true。这是我默认想要的。但是,当我执行一个特定任务时,我希望useProguard为false。Android范围内的所有内容都来自sbt Android插件 我不知道如何最好地解决这个问题。从我所读到的内容来看,命令似乎可以完成任务,因为它可以以与当前会话所看到的不同的状态执行任务。我试图创建这样一个命令,如下所示: def buildWithoutProguard = Command.comm

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

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

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
}
我将该命令附加到我的项目设置中,并运行“buildwithoutproguard”命令,根据需要执行buildAndRun任务。然而,useProguard仍然是正确的,而不是我所期望的错误

首先,我觉得整个方法都很严厉。假设更改sbt android插件不是一个选项,那么我该如何解决这个问题呢


其次,为什么这种方法不能按原样工作?

根据我从您的问题中了解到的情况,您希望依赖项的设置根据依赖项的内容而有所不同。这是没有意义的——依赖关系要么满足要么不满足,依赖于它的东西不在等式中


你的解决方案似乎令我满意。另一种方法是制作两个项目,指向同一个源,但具有不同的proguard设置和不同的目标,因此一个项目将使用proguard进行构建,另一个项目将不使用proguard,并且两者都将保持其状态。然后你可以做任何你想做的事情,只需切换项目。

嗨,丹尼尔,谢谢你的回答。单独的项目似乎确实是一条路要走。我仍然很好奇为什么命令不能像它看起来应该的那样工作。任务轴不是做了类似于“根据依赖它的内容更改依赖关系”的事情吗?如果您有一个依赖于某个设置的任务,那么该设置是否可以根据正在运行的任务而具有不同的值?@JamesMoore不,它没有,不,它不能。实际上,可以将设置的范围限定到某个特定的任务,但前提是该任务期望它是这样的(换句话说,如果该任务的作者将其编码为在其自己的范围内查找关键字).可能的副本