考虑一个简单的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
你可以看到在两种情况下执行任务编译,认为它应该只在第一个中执行。
我的问题是:
答案 0 :(得分:2)
这是因为task
密钥是根据packageBin in Compile
密钥定义的。因此,即使它的值只用在代码的一个分支中,它的效果(println)也会在两个分支中执行。
解决方案是使用taskDyn:http://www.scala-sbt.org/0.13/docs/Tasks.html#Dynamic+Computations+with