2012-02-21 23 views
5

作为项目构建的一部分,我想将受管依赖项的zip文件解压缩到项目的特定目录中。在开始使用SBT之前,我通过一个ANT脚本来完成此操作,该脚本可以从Maven依赖关系中获取zip文件并将其解压缩。使用SBT解压缩构件

我的问题(S)是:

  • 如何指定我要依靠的zip依赖?我已经这样定义它: "eu.delving" % "sip-creator" % "0.4.6-SNAPSHOT" 但这并不取得邮编神器
  • 在哪里/如何挂钩到生成过程中运行解压缩(以及如何参考在该上下文中的工件文件)?
+0

运气好的解决这个? – Arjan 2012-03-21 21:28:09

+0

还没有。到目前为止,我仍然使用它的ANT版本来执行此操作。 – 2012-04-29 14:20:35

+0

关于钩住解压缩操作的第二部分,您应该检查Tasks wiki https://github.com/harrah/xsbt/wiki/Tasks。查看如何声明它们,然后建立依赖关系,以便在构建或打包时触发。 – 2012-08-03 17:35:53

回答

6

如果你想提取一组托管的依赖关系,下面的代码应该工作。我在sbt 0.12.0中测试过它,但它也应该可以与0.11.x一起使用。

import sbt._ 
import Keys._ 
import Classpaths.managedJars 

object TestBuild extends Build { 

    lazy val jarsToExtract = TaskKey[Seq[File]]("jars-to-extract", "JAR files to be extracted") 

    lazy val extractJarsTarget = SettingKey[File]("extract-jars-target", "Target directory for extracted JAR files") 

    lazy val extractJars = TaskKey[Unit]("extract-jars", "Extracts JAR files") 

    lazy val testSettings = Defaults.defaultSettings ++ Seq(
     // define dependencies 
     libraryDependencies ++= Seq(
      "com.newrelic" % "newrelic-api" % "2.2.1" 
     ), 

     // collect jar files to be extracted from managed jar dependencies 
     jarsToExtract <<= (classpathTypes, update) map { (ct, up) => 
      managedJars(Compile, ct, up) map { _.data } filter { _.getName.startsWith("newrelic-api") } 
     }, 

     // define the target directory 
     extractJarsTarget <<= (baseDirectory)(_/"extracted"), 

     // task to extract jar files 
     extractJars <<= (jarsToExtract, extractJarsTarget, streams) map { (jars, target, streams) => 
      jars foreach { jar => 
       streams.log.info("Extracting " + jar.getName + " to " + target) 
       IO.unzip(jar, target) 
      } 
     }, 

     // make it run before compile 
     compile in Compile <<= extractJars map { _ => sbt.inc.Analysis.Empty } 
    ) 

    lazy val test: Project = Project("test", file(".")) settings (testSettings: _*) 
} 

如果您只需要解压缩jar文件,则可以将它们添加为非托管依赖项,即。把它们放到/ lib文件夹中。请参阅:https://github.com/harrah/xsbt/wiki/Getting-Started-Library-Dependencies

如果你真的有zip文件(或要提取的非托管依赖),你可以改变上面的代码一一列举:

// list jar files to be extracted 
jarsToExtract <<= (baseDirectory) map { dir => Seq(dir/"lib"/"newrelic-api-2.2.1.zip") }, 

您现在应该能够从手动提取它们SBT他们应该自动编译之前提取:

> clean 
[success] Total time: 0 s, completed Oct 12, 2012 5:39:16 PM 
> extract-jars 
[info] Extracting newrelic-api-2.2.1.zip to /Users/balagez/Sites/test/extracted 
[success] Total time: 0 s, completed Oct 12, 2012 5:39:22 PM 
> compile 
[info] Extracting newrelic-api-2.2.1.zip to /Users/balagez/Sites/test/extracted 
[success] Total time: 0 s, completed Oct 12, 2012 5:39:24 PM 

现在你可以添加新任务或延长现有中提取从提取的依赖的zip文件。如果你不需要依赖关系的内容,你可以用它给你的SBT一个临时目录可写的任务,临时目录设置:

// define the target directory 
extractJarsTarget <<= taskTemporaryDirectory, 
+0

谢谢。是的,我真的有一个ZIP文件,它是作为一个Maven存储库中的工件生成的。我将在接下来的几天内检查SBT如何检索它,然后使用你的代码来完成这项工作。 – 2012-10-24 16:30:39