2011-09-13 29 views
5

我想定义一个任务,调用compile和packageBin任务,然后完成它的任务。我怎么做?目前这只能做第二部分,并跳过编译& packageBin任务。如何依靠其他任务并在SBT 0.10中执行代码?

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

至于解决方法,我可以使用〜; compile; package; dist任务 – arturaz

回答

3

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

dist <<= (update, crossTarget, packageBin in Compile) map { (updateReport, out, _) => 

这是不可能的,你想在一个UpdateReport的所有文件复制到单独的文件的名称基于目录。不同的依赖关系可能具有相同的文件名。此外,这将包括来自所有配置的依赖性,包括测试依赖性。

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

updateReport.matching(configurationFilter(Runtime.name)).foreach... 

看到其他有用的方法sbt.UpdateReportsbt.RichUpdateReport API文档。

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

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

,并从cp.filesSeq[File]

+0

感谢您的很好回答。但是,当我尝试添加packagebin作为依赖项时,我得到: [错误] sbt.Init $未初始化:引用未初始化的设置{file:/ home/arturas/work/spacegame/server/vendor/SpaceMule /} SpaceMule/*:来自{file:/ home/arturas/work/spacegame/server/vendor/SpaceMule /}的封装SpaceMule/*:dist [错误]对完整日志使用'last'。 – arturaz

+0

您是否包含'in Compile'部分? –

+1

哦,我一定错过了它。它现在的作品,谢谢:) – arturaz

相关问题