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

art*_*raz 5 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)
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*rah 3

<<=是 TaskKey 上的一个返回值的方法。它不会在任何地方更新可变状态,因此在示例代码中,第一次调用的结果将被丢弃。要解决此问题,请将 packageBin 也声明为输入,但忽略结果值。注意packageBin依赖于compile,所以依赖compile是不必要的。

dist <<= (update, crossTarget, packageBin in Compile) map { (updateReport, out, _) =>
Run Code Online (Sandbox Code Playgroud)

您不太可能希望UpdateReport仅根据文件名将所有文件复制到一个目录中。不同的依赖项可能具有相同的文件名。此外,这将包括所有配置的依赖项,包括测试依赖项。

对于第一个问题,使用关联ModuleID来构建目标目录中的路径,就像在lib_managed目录中所做的那样retrieveManaged := true。对于第二个问题,仅选择所需配置的文件。

updateReport.matching(configurationFilter(Runtime.name)).foreach...
Run Code Online (Sandbox Code Playgroud)

有关其他有用的方法,请参阅sbt.UpdateReportsbt.RichUpdateReport API 文档。

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

dist <<= (crossTarget, packageBin in Compile, dependencyClasspath in Runtime) map { (out, _, cp) =>
Run Code Online (Sandbox Code Playgroud)

并获取Seq[File]来自cp.files.