作爲項目構建的一部分,我想將受管依賴項的zip文件解壓縮到項目的特定目錄中。在開始使用SBT之前,我通過一個ANT腳本來完成此操作,該腳本可以從Maven依賴關係中獲取zip文件並將其解壓縮。使用SBT解壓縮構件
我的問題(S)是:
- 如何指定我要依靠的zip依賴?我已經這樣定義它:
"eu.delving" % "sip-creator" % "0.4.6-SNAPSHOT"
但這並不取得郵編神器 - 在哪裏/如何掛鉤到生成過程中運行解壓縮(以及如何參考在該上下文中的工件文件)?
作爲項目構建的一部分,我想將受管依賴項的zip文件解壓縮到項目的特定目錄中。在開始使用SBT之前,我通過一個ANT腳本來完成此操作,該腳本可以從Maven依賴關係中獲取zip文件並將其解壓縮。使用SBT解壓縮構件
我的問題(S)是:
"eu.delving" % "sip-creator" % "0.4.6-SNAPSHOT"
但這並不取得郵編神器如果你想提取一組託管的依賴關係,下面的代碼應該工作。我在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,
謝謝。是的,我真的有一個ZIP文件,它是作爲一個Maven存儲庫中的工件生成的。我將在接下來的幾天內檢查SBT如何檢索它,然後使用你的代碼來完成這項工作。 – 2012-10-24 16:30:39
運氣好的解決這個? – Arjan 2012-03-21 21:28:09
還沒有。到目前爲止,我仍然使用它的ANT版本來執行此操作。 – 2012-04-29 14:20:35
關於鉤住解壓縮操作的第二部分,您應該檢查Tasks wiki https://github.com/harrah/xsbt/wiki/Tasks。查看如何聲明它們,然後建立依賴關係,以便在構建或打包時觸發。 – 2012-08-03 17:35:53