我想定义一个任务,它调用compile和packageBin任务,然后完成它的工作。我怎么做?目前这只是第二部分,并跳过编译& packageBin任务。
lazy val dist = TaskKey[Unit](
"dist", "Creates a project distribution in dist/ folder."
)
def distTask = {
dist <<= dist.dependsOn(compile, packageBin)
dist <<= (update, crossTarget).map { case (updateReport, out) =>
updateReport.allFiles.foreach { srcPath =>
val destPath = out / "lib" / srcPath.getName
IO.copyFile(srcPath, destPath, preserveLastModified=true)
}
}
}
答案 0 :(得分:3)
<<=
是TaskKey上返回值的方法。它不会在任何地方更新可变状态,因此在示例代码中,第一个调用的结果将被丢弃。要解决此问题,请将packageBin声明为输入,但忽略结果值。请注意,packageBin依赖于编译,因此根据编译是不必要的。
dist <<= (update, crossTarget, packageBin in Compile) map { (updateReport, out, _) =>
您不太可能只想根据文件名将UpdateReport
中的所有文件复制到目录中。不同的依赖项可能具有相同的文件名。此外,这将包括来自所有配置的依赖项,包括测试依赖项。
对于第一个问题,使用关联的ModuleID
在目标目录中构造路径,就像在lib_managed
时在retrieveManaged := true
目录中完成的那样。对于第二个问题,只选择所需配置的文件。
updateReport.matching(configurationFilter(Runtime.name)).foreach...
有关其他有用的方法,请参阅sbt.UpdateReport和sbt.RichUpdateReport API文档。
如果您不关心文件名冲突,可以从dependencyClasspath获取依赖项文件。例如:
dist <<= (crossTarget, packageBin in Compile, dependencyClasspath in Runtime) map { (out, _, cp) =>
并从Seq[File]
获取cp.files
。