如何依赖其他任务并在SBT 0.10中执行代码?

时间:2011-09-13 11:07:36

标签: scala sbt

我想定义一个任务,它调用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)
    }
  }
}

1 个答案:

答案 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.UpdateReportsbt.RichUpdateReport API文档。

如果您不关心文件名冲突,可以从dependencyClasspath获取依赖项文件。例如:

dist <<= (crossTarget, packageBin in Compile, dependencyClasspath in Runtime) map { (out, _, cp) =>

并从Seq[File]获取cp.files