为什么sbt执行冗余任务?

时间:2017-01-20 11:45:15

标签: sbt

考虑一个简单的sbt文件:

lazy val task = taskKey[Unit]("task")

lazy val p = project.in(file(".")).settings(
  packageBin in Compile := {
    println("compile")
    (packageBin in Compile).value
  },
  task := {
    sys.props.get("conf") match {
      case Some(t) => println(t)
      case None => println((packageBin in Compile).value)
    }
  }
)

两次运行:

sbt task
[info] Set current project to p (in build file:...)
compile
.../target/scala-2.10/p_2.10-0.1-SNAPSHOT.jar
[success] Total time: 1 s, completed Jan 20, 2017 1:11:48 PM

sbt -Dconf=xxx task
[info] Set current project to p (in build file:...)
compile
xxx
[success] Total time: 1 s, completed Jan 20, 2017 1:13:39 PM

你可以看到在两种情况下执行任务编译,认为它应该只在第一个中执行。

我的问题是:

  1. 为什么会这样?我认为这是因为宏值的实现,但我对scala宏和sbt内部的理解太低,无法解释原因。
  2. 除了定义两个不同的任务外,还有其他解决方法吗?
  3. 我依靠道具使用错误的模式吗?

1 个答案:

答案 0 :(得分:2)

这是因为task密钥是根据packageBin in Compile密钥定义的。因此,即使它的值只用在代码的一个分支中,它的效果(println)也会在两个分支中执行。

解决方案是使用taskDyn:http://www.scala-sbt.org/0.13/docs/Tasks.html#Dynamic+Computations+with