如何防止sbt在会话中多次运行任务?

如何防止sbt在会话中多次运行任务?,sbt,Sbt,我想防止在sbt运行时多次运行以下任务: val myTask = someSettings map {s => if !s.isDone doSomethingAndSetTheFlag} 因此,当myTask第一次运行时,isDone为false,任务中完成了一些事情,然后任务将标志设置为true,这是预期的结果。但是,当任务第二次运行时,由于isDone标志为true,它将跳过实际执行块 预期的行为类似于编译->编译源代码时,任务不会在下次触发时再次编译代码,直到watchSour

我想防止在sbt运行时多次运行以下任务:

val myTask = someSettings map {s => if !s.isDone doSomethingAndSetTheFlag}
因此,当myTask第一次运行时,isDone为false,任务中完成了一些事情,然后任务将标志设置为true,这是预期的结果。但是,当任务第二次运行时,由于isDone标志为true,它将跳过实际执行块

预期的行为类似于编译->编译源代码时,任务不会在下次触发时再次编译代码,直到watchSource任务表示代码已更改


可能吗?如何执行?

这是由sbt完成的,任务在一次运行中仅评估一次。如果希望在项目加载时对值求值一次,可以将其更改为一个值

这记录在(突出显示是我的):

如引言中所述,任务是按需评估的。每个 例如,调用sampleTask时,它将打印总和。如果 在运行之间更改用户名,stringTask将采用不同的值 在这些单独的运行中。(在一次运行中,每个任务都在 大多数是一次。)相反,设置在项目加载时只评估一次 在下一次重新加载之前,都是固定的


谢谢你的回答,但这并不是我要问的(我的问题让人困惑,我为此道歉)。我已经编辑了这个问题,你能再看一下吗?@NSF我可以问一下你到底想做什么吗?如果只计算一次,并且不依赖于任何输入更改,为什么不将其设置为一个设置呢。如果您的任务依赖于输入(例如编译),则情况就不同了。是吗?所以myTask中的执行块(比如,特定的资源生成)需要很长时间才能运行(比如,20秒),我让compile依赖于它,在这种情况下,每当运行compile时,任务都会被触发。但是我想让它只运行一次(即第一次编译是在一个会话中运行的)。这个任务有什么产品吗?如果是这样,您可以缓存产品,并且每次运行任务时,除了第一个任务外,还可以返回缓存的内容。因此,任务仍然运行多次,但实际上只执行一次工作。这就是任务(如
compile
)的行为方式-如果没有什么可重新编译的内容,任务将运行,但不做任何工作。