2012-02-21 5 views
5

プロジェクトのビルドの一環として、プロジェクトの特定のディレクトリに管理対象依存のジップアーティファクトを解凍したいと思います。 SBTの使用を開始する前に、私はMaven依存関係からZIPアーティファクトを取り出して解凍するANTスクリプトを使用してこれを実行していました。SBTでアーティファクトの解凍

私の質問(複数可)は次のとおりです。

  • 私はジップ依存関係に依存することを指定する方法? "eu.delving" % "sip-creator" % "0.4.6-SNAPSHOT" しかし、これはジップアーティファクトをフェッチしません。
  • ここで/ unzipを実行するためのビルドプロセスにフックする方法(およびそのコンテキストでアーティファクトファイルを参照する方法)はありますか?
+0

この問題を解決するには? – Arjan

+0

まだありません。これまでのところANTバージョンを使用しています。 –

+0

解凍アクションのフックに関する2番目の部分については、タスクwiki https://github.com/harrah/xsbt/wiki/Tasksをチェックしてください。それらを宣言する方法を調べ、ビルドやパッケージング時にトリガーするように依存関係を確立します。 –

答えて

6

管理依存関係のセットを抽出する場合は、以下のコードが有効です。私はsbt 0.12.0でテストしましたが、0.11.xでも動作するはずです。あなたは、単に抽出するためにjarファイルを持っている場合は

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: _*) 
} 

、あなたはすなわち、管理対象外の依存関係、としてそれらを追加することができます。それらを/ libフォルダに入れます。あなたが本当にzipファイルを持っている(または管理対象外の依存関係を抽出したい)場合はhttps://github.com/harrah/xsbt/wiki/Getting-Started-Library-Dependencies

、あなたがそれらを一覧表示するには上記のコードを変更することができます:参照してください

// 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によってどのように取り出されているのかを確認し、あなたのコードを使って作業を行います。 –