【问题标题】:Calling a TaskKey with different settings调用具有不同设置的 TaskKey
【发布时间】:2015-12-05 09:38:12
【问题描述】:

我正在使用插件sbt-assembly(版本 0.13.0),我想根据某些InputKey 调用assemblyPackageDependency 或不使用appendContentHash

基本上,我想做这样的事情:

lazy val isGlobalCached = InputKey[Boolean]("")

lazy val myTask = taskKey[sbt.File]("myTask")

myTask := {
    if (isGlobalCached.value)
        //run with the modified assemblyOption
        //assemblyOption in assemblyPackageDependency ~= { x => x.copy(appendContentHash = true) }
        assemblyPackageDependency.value
    else
        assemblyPackageDependency.value
}

但我不知道如何设置 assemblyOption 仅当条件为真而不是全局时


以下是我尝试过的一些无效的方法:

lazy val isGlobalCached = InputKey[Boolean]("")

lazy val myTask = taskKey[sbt.File]("myTask")

lazy val assemblyPackageDependencyWithHash = taskKey[sbt.File]("assemblyPackageDependencyWithHash")


assemblyPackageDependencyWithHash <<= assemblyPackageDependency
assemblyOption in assemblyPackageDependencyWithHash ~= { x => x.copy(appendContentHash = true) }

myTask := {
    //run with the modified assemblyOption
    if (isGlobalCached.value)
        assemblyPackageDependencyWithHash.value
    else
        assemblyPackageDependency.value
}

和:

lazy val isGlobalCached = InputKey[Boolean]("")

lazy val myTask = taskKey[sbt.File]("myTask")

lazy val globalCacheConf = config("globalCacheConf")

assemblyOption  in globalCacheConf := (assemblyOption in assemblyPackageDependency).value.copy(appendContentHash = true)

myTask := {
    //run with the modified assemblyOption
    if (isGlobalCached.value)
        assemblyPackageDependency.in(globalCacheConf).value
    else
        assemblyPackageDependency.value
}

【问题讨论】:

    标签: scala sbt sbt-assembly sbt-plugin sbt-0.13


    【解决方案1】:
    import complete.DefaultParsers._
    
    val myCmd : Command = Command("myCmd")(_ => Space ~> Bool) { (state, globalCached) =>
      val extracted = Project extract state
      import extracted._
      Project.runTask(
        assemblyPackageDependency,
        append(Seq(assemblyOption in assemblyPackageDependency := globalCached), state)
      )
      state
    }
    
    commands += myCmd
    

    【讨论】:

    • 谢谢,命令可能是这样做的方法。我将此逻辑用作另一项任务的一部分。我可以执行命令,得到assemblyPackageDependency的结果吗?
    • runTask函数返回一个Option[(State, Result[T])],从中可以得到任务的结果。
    • 命令,不像任务,不返回值作为结果。因此,如果您想对任务的结果执行某些操作(例如打印结果),您应该: 1) 在命令中执行,在 runTask 函数调用之后。或 2) 定义一个新任务,在新任务中执行,并在命令中运行新任务。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-29
    • 1970-01-01
    • 2013-03-21
    • 2016-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多