我想定义一个任务,它调用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)
<<=是 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.UpdateReport和sbt.RichUpdateReport API 文档。
如果您不担心文件名冲突,可以从 dependencyClasspath 获取依赖文件。例如:
dist <<= (crossTarget, packageBin in Compile, dependencyClasspath in Runtime) map { (out, _, cp) =>
Run Code Online (Sandbox Code Playgroud)
并获取Seq[File]来自cp.files.
| 归档时间: |
|
| 查看次数: |
950 次 |
| 最近记录: |