SBT中的变量相关任务

时间:2015-01-11 23:43:21

标签: sbt sbt-0.13

我可以创建一个Makefile,其目标是处理目录中的所有源。

SOURCE_DIR := src

TARGET_DIR := target

SOURCES := $(wildcard $(SOURCE_DIR)/*)

$(TARGET_DIR)/%: $(SOURCE_DIR)/%
    md5sum $^ > $@

all: $(SOURCES:$(SOURCE_DIR)/%=$(TARGET_DIR)/%)

这里的一个很好的优点是每个文件都是一个单独的目标,因此可以逐步和并发地处理它们。在这种情况下,并发部分很重要。


我正在尝试与SBT类似的东西,但我发现它非常困难。 Make目标的SBT模拟看起来是一项任务,因此我尝试创建一个聚合可变数量的较小任务的任务。

import org.apache.commons.codec.digest.DigestUtils

all <<= Def.task().dependsOn({
    file(sourceDir.value).listFiles.map { source =>
        val target = rebase(sourceDir.value, targetDir.value)(f)
        Def.task {
            IO.write(target, DigestUtils.md5Hex(IO.readBytes(source)))
        }
    }
}: _*)

我收到错误

`value` can only be used within a task or setting macro, such as :=, +=, ++=,
Def.task, or Def.setting

如何使用动态数量的并发目标/任务制作一个类似于我的Makefile的正确SBT构建文件?

1 个答案:

答案 0 :(得分:1)

我需要flatMap

all <<= (sourceDir, targetDir).flatMap { (sourceDir, targetDir) =>
    task{}.dependsOn({
        file(sourceDir).listFiles.map { source =>
            task {
                val target = rebase(sourceDir, targetDir)(f)
                IO.write(target, DigestUtils.md5Hex(IO.readBytes(source)))
            }
        }
    }: _*)
}

task{}.dependsOn(...: _*)可能有一种更为流畅的方式,但我不知道它是什么。