2011-09-08 31 views
8

我使用sbt 0.10和Scala 2.9.1。收集sbt 0.10下的依赖关系(将所有依赖项jar放到目标/ scala-version/lib /中)

我读过 http://groups.google.com/group/simple-build-tool/browse_thread/thread/792e5360877e78/987b6af687b8e33b?lnk=gst&q=collect+jars#987b6af687b8e33b

但是我不想一个巨大的罐子。我只是想依赖罐子 结束在目标/ scala-2.9.1.final/lib目录。

为什么我不想要一个巨大的jar,那个项目使用了很多 libs,通常只有应用程序.jar会改变。然而,由于这个 是多语言项目,并不是所有的团队成员都有scala或sbt,所以只需将 jar添加到git。有一个巨大的dar更新regullary 会膨胀回购规模。

如何复制这些依赖关系? ;)

回答

14

没有指定的常春藤配置的配置从复制,但这里有一个完全工作的例子,将复制所有托管依赖于target/<scala version>/lib文件夹(Scala的版本由crossTarget任务给出)。如果你想有一个特定的配置

import sbt._ 
import Keys._ 

object MyBuild extends Build { 

    lazy val copyDependencies = TaskKey[Unit]("copy-dependencies") 

    def copyDepTask = copyDependencies <<= (update, crossTarget, scalaVersion) map { 
    (updateReport, out, scalaVer) => 
    updateReport.allFiles foreach { srcPath => 
     val destPath = out/"lib"/srcPath.getName 
     IO.copyFile(srcPath, destPath, preserveLastModified=true) 
    } 
    } 

    lazy val root = Project(
    "root", 
    file("."), 
    settings = Defaults.defaultSettings ++ Seq(
     copyDepTask 
    ) 
) 
} 

,由你想updateReport.select(configuration = Set("compile"))或任何常春藤配置替代

updateReport.allFiles:只需复制这一点,并把它(你想或任何文件名)的文件project/Build.scala英寸

1

各种“Classpath”键在类路径中包含不同的视图,但最简单的方法是修改sbt-assembly插件,以便将jar放入目录,而不是进行解压缩/重新编译循环。该插件非常小(只有150行),从粗略浏览中可以明显看出正确的地方是什么。