2012-02-21 29 views
5

Là một phần của dự án xây dựng của tôi, tôi muốn giải nén một tạo tác zip của một phụ thuộc được quản lý vào một thư mục cụ thể của dự án. Trước khi bắt đầu sử dụng SBT, tôi đã thực hiện điều này thông qua một tập lệnh ANT có thể tìm nạp các tạo phẩm zip từ một phụ thuộc maven và giải nén nó.Giải nén một tạo phẩm với SBT

Câu hỏi của tôi (s) là:

  • làm thế nào để xác định rằng tôi muốn phụ thuộc vào sự phụ thuộc zip? Tôi đã xác định nó giống như vậy: "eu.delving" % "sip-creator" % "0.4.6-SNAPSHOT" nhưng điều này không tìm nạp phần zip hiện tại
  • nơi/cách móc vào quá trình xây dựng để chạy giải nén (và cách tham chiếu tệp artifact trong ngữ cảnh đó)?
+0

Bất kỳ may mắn giải quyết này? – Arjan

+0

Chưa. Cho đến nay tôi vẫn đang sử dụng phiên bản ANT của nó để làm như vậy –

+0

Đối với phần thứ hai liên quan đến việc hooking hành động giải nén, bạn nên kiểm tra các nhiệm vụ wiki https://github.com/harrah/xsbt/wiki/Tasks. Tra cứu cách khai báo và sau đó thiết lập các phụ thuộc để nó kích hoạt khi xây dựng hoặc đóng gói. –

Trả lời

6

Nếu bạn muốn trích xuất một tập hợp các phụ thuộc được quản lý, mã bên dưới sẽ hoạt động. Tôi đã thử nghiệm nó trong sbt 0.12.0, nhưng nó cũng nên làm việc với 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: _*) 
} 

Nếu bạn chỉ cần có tệp jar để trích xuất, bạn có thể thêm chúng dưới dạng phụ thuộc không được quản lý, tức là. đưa chúng vào thư mục/lib. Xem: https://github.com/harrah/xsbt/wiki/Getting-Started-Library-Dependencies

Nếu bạn thực sự có file zip (hoặc muốn trích xuất các phụ thuộc không được quản lý), bạn có thể thay đổi mã ở trên để liệt kê chúng:

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

Bây giờ bạn sẽ có thể tự giải nén chúng từ sbt và chúng sẽ tự động được trích xuất trước khi biên dịch:

> 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 

Bây giờ bạn có thể thêm một tác vụ mới hoặc mở rộng tác vụ hiện có để trích xuất tệp nén từ phụ thuộc được trích xuất. Nếu bạn không cần nội dung của sự phụ thuộc, bạn có thể sử dụng các thiết lập nhiệm vụ tạm thời thư mục mang đến cho bạn một ghi thư mục tạm thời bởi SBT:

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

Cảm ơn. Có, tôi thực sự có một tệp ZIP được tạo như một tạo phẩm trên kho lưu trữ maven. Tôi sẽ kiểm tra trong những ngày tiếp theo làm thế nào nó có thể được lấy bởi SBT và sau đó sử dụng mã của bạn để thực hiện công việc. –