sbt0.12.xで依存jar抽出タスク

sbtで、プロジェクト依存jarを、ivy2キャッシュからごっそりまとめて抽出するTaskの作り方。

Liftのアップグレードに伴い sbtも0.12.xを使い始めた。
依存jarは、USER_HOME/.ivy2 キャッシュを直接参照して、プロジェクト内にコピーを作らなくなったようだ。

でも、必要なjarを一か所にまとめたいことってあると思うんですが、手動でivyキャッシュから依存関係を確かめながらコピーなんて不可能。

で、Taskの自作にトライしてみました。まずSBTのドキュメント読んで、Taskに関係しそうなところは、
Getting Started | More Kind Of Settings
Tasks
Task Input/Dependencies


依存jar抽出タスク

build.sbtに次のタスクを追記します。

TaskKey[Seq[java.io.File]]("collect-jars") <<=
 ( dependencyClasspath in Compile ) map { paths =>
  paths.map { path =>
   val jar = path.data
   val dist = new File("target/lib/"+jar.getName)
   org.apache.ivy.util.FileUtil.copy(jar,dist,null)
   dist
  }
 }

あとは実行すれば target/lib の下にコンパイルに必要なjarを吸い上げるはず。

C:\xxx> sbt
> collect-jars
> show collect-jars (吸い上げたファイルを表示したい場合)

タスクを作成するときの書き方はいろいろあるようですが、一か所にさらっと書く方法をとりました(あとフォルダがないときとかExceptionとかもここでは省略)。


ちょっと解説すると、

コード中の
( dependencyClasspath in Compile ) 
は、

> show compile:dependency-classpath

のタスク本体で、その実行結果(paths)を自作タスクに渡して処理するようになっています。

"dependency-classpath"というタスクをどうやって見つけたかというと、

C:\xxx> sbt
> ここでTABを3回たたくと ↓
Display all 245 possibilities? (y or n)

"y"で、全てのtaskが表示されます。その中からそれっぽい名前のやつを見つけました。

タスクの実行は、環境によって異なる結果を持つものは、
"<環境>:<タスク名>"

タスクの戻り値を見たい場合は、
"show <タスク名>"

とします。

例:
> compile:dependency-classpath
> test:dependency-classpath
> show compile:dependency-classpath

だいたいの仕組みがわかれば、デフォルトタスク組み合わせて補完するなど、いろいろできそうです。


同じカテゴリのエントリ
1.Lift再入門 / 8.javascriptからsubmitできない / 7.Ajax Form / 6.Radio、Checkboxについて / 5.行列型の編集FORM / 4.サーバーサイドバリデーションとサーバサイド関数 / 3.ログインFORM - S.param使ったら負け / 2.Snippetメソッドとして許される型 / sbt0.12.xで依存jar抽出タスク / scala2.10+lift2.5+NetBeans7.2 / Scalaで入門関数プログラミング / reactive-webを試してみました / Lift2.2M1のテンプレート機能 / Scala Compiler Plugin / View Bound/Context Bound / ScalaZa01参加してきました / Akka Frameworkチュートリアルの次 / Akka Frameworkチュートリアルその2 / Akka Frameworkチュートリアル / LiftでJCaptcha / Url Rewrite Filter / sbt-android-plugin / Android SDK for Scala / 祝Lift2.0リリース / Liftの携帯対応まとめ / Scala2.8への移行 / Lift 2.0-scala280-SNAPSHOT/sbt0.7.1 / Scalaお絵かき環境 - Kojo / Lift+Quartzでバッチ / Scala&Liftを採用した理由 / Liftでdate_select系ヘルパーを作る / LiftでAjax / LiftのSubmitかしこい / lift-mapperのpaginateを使う / snippetをspecする / Lift Mapperを拡張する / LiftのDBをMySQLに / Liftプロジェクト環境を整える / Scala本読み比べてみました / NetBeans6.7&scala / じつはScalaはライトな言語 / Scalaバザ~ル / lift1.0所感 / specsを読む / implicit def / ScalaならNetBeansがサイコー / scala勉強会@東北がスタート / それでも俺はLiftをやるってのか / Scala&Liftセットアップ / ブログリニューアル /
コメント

コメントしてください

closed.