简体   繁体   English

SBT中的变量相关任务

[英]Variable dependent tasks in SBT

I can make a Makefile that has a target that processes all sources in the directory. 我可以创建一个具有处理目录中所有源文件的目标的Makefile。

SOURCE_DIR := src

TARGET_DIR := target

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

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

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

A nice advantage here is that each file is a separate target, so they can be processed incrementally, and concurrently. 这里的一个好处是,每个文件都是一个单独的目标,因此可以递增地并发地对其进行处理。 The concurrent part is important in this situation. 在这种情况下,并发部分很重要。


I am trying to something similar with SBT, but am finding it surprisingly difficult. 我正在尝试与SBT类似的东西,但是发现它出奇的困难。 The SBT analog of a Make target sees to be a task, so I try creating one task that aggregate a variable number of smaller tasks. 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)))
        }
    }
}: _*)

I get the error 我得到错误

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

How can I make a proper SBT build file that resembles my Makefile, with a dynamic number of concurrent targets/tasks? 我如何制作一个与我的Makefile相似的,具有动态并发目标/任务数量的SBT构建文件?

I needed flatMap . 我需要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)))
            }
        }
    }: _*)
}

There might be a slicker way to do task{}.dependsOn(...: _*) , but I don't know what it is. 可能有一种轻松的方式来执行task{}.dependsOn(...: _*) ,但我不知道它是什么。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM