Scala を書くときは IntelliJ Idea みたいな IDE を使っていればドキュメントを確認しやすいのだけど、やっぱ手慣れたものを使いたい。というわけでだいたいの時間はテキストエディタ(Vim)を使っている。そういう時、ソースコードが手元にあると開発の助けになる。
updateClassifiers タスクを使うことですべての(推移的)依存をダウンロードできるらしいが、この場合ファイルは ~/.ivy2/cache/{organization}/{module}/docs/{artifact}-{revision}-javadoc.jar
といった場所に保存される。IDE か何かを使ったら閲覧できるのだろうけど、普段使いでは jar 形式で置かれるのは少し面倒だ。
公開されているプロジェクトは全部 ghq という自作ツールでもって手元に整理された状態でクローンするようにしているので、Scala/Java のソースコードもこれにのっとって手元に置きたい。
というわけで sbt プラグインを書いたという話です: sbt-ghq-get-dependencies。
使い方
これは性質的に各プロジェクトのプラグインとして設定するよりは、グローバルなところに置くのが良いでしょう。
~/.sbt/0.13/plugins/ghq.sbt
みたいなファイルを作って以下のように書く。
resolvers += Resolver.url("bintray-motemen-sbt-plugins", url("https://dl.bintray.com/motemen/sbt-plugins"))(Resolver.ivyStylePatterns) addSbtPlugin("com.github.motemen" % "sbt-ghq-get-dependencies" % "0.2.0")
sbt から使えるキーは以下のふたつ。
ghqGetDependencies
……TaskKey[Unit]
。現在のプロジェクトの(直接の)依存ライブラリの SCM リポジトリを探してきて、あればghq get
する。ghqFilterModule
……SettingKey[sbt.ModuleID => Boolean]
。依存モジュールをghq get
すべきかどうかを判断する関数。デフォルトではconfigurations
がNone
かSome("test")
であるものだけダウンロード対象とする。
リポジトリの URL は ~/.ivy2/cache
以下の ivy-*.xml.original
ファイルに書かれているものを使用するので、あらかじめ update
しておく必要がある。
実行するとこんな感じ。
> ghqGetDependencies [info] org.scala-lang#scala-library;2.11.7 :: git://github.com/scala/scala.git exists /Users/motemen/dev/src/github.com/scala/scala [info] org.scala-lang#scala-library;2.11.7 :: git://github.com/scala/scala.git exists /Users/motemen/dev/src/github.com/scala/scala [info] org.scalatra#scalatra_2.11;2.4.0 :: git://github.com/scalatra/scalatra.git exists /Users/motemen/dev/src/github.com/scalatra/scalatra [info] org.scalatra#scalatra-scalate_2.11;2.4.0 :: git://github.com/scalatra/scalatra.git exists /Users/motemen/dev/src/github.com/scalatra/scalatra [info] org.scalatra#scalatra-scalatest_2.11;2.4.0 :: git://github.com/scalatra/scalatra.git exists /Users/motemen/dev/src/github.com/scalatra/scalatra [info] org.scalaj#scalaj-http_2.11;1.1.6 :: git@github.com:scalaj/scalaj-http.git exists /Users/motemen/dev/src/github.com/scalaj/scalaj-http [info] org.json4s#json4s-jackson_2.11;3.3.0 :: git://github.com/json4s/json4s.git exists /Users/motemen/dev/src/github.com/json4s/json4s [info] org.scalaz#scalaz-core_2.11;7.1.4 :: git@github.com:scalaz/scalaz.git exists /Users/motemen/dev/src/github.com/scalaz/scalaz [info] org.scalaz#scalaz-concurrent_2.11;7.1.4 :: git@github.com:scalaz/scalaz.git exists /Users/motemen/dev/src/github.com/scalaz/scalaz [info] com.typesafe.slick#slick_2.11;3.1.1 :: git@github.com:slick/slick.git exists /Users/motemen/dev/src/github.com/slick/slick [info] org.postgresql#postgresql;9.4.1207 :: (not found) [info] com.github.tarao#slick-jdbc-extension_2.11;0.0.3 :: git@github.com:tarao/slick-jdbc-extension-scala.git exists /Users/motemen/dev/src/github.com/tarao/slick-jdbc-extension-scala [info] net.debasishg#redisclient_2.11;3.1 :: git@github.com:debasishg/scala-redis.git exists /Users/motemen/dev/src/github.com/debasishg/scala-redis [info] org.pegdown#pegdown;1.6.0 :: git@github.com:sirthias/pegdown.git clone ssh://git@github.com/sirthias/pegdown.git -> /Users/motemen/dev/src/github.com/sirthias/pegdown git clone ssh://git@github.com/sirthias/pegdown.git /Users/motemen/dev/src/github.com/sirthias/pegdown Cloning into '/Users/motemen/dev/src/github.com/sirthias/pegdown'... [info] org.mockito#mockito-core;2.0.36-beta :: (not found) [success] Total time: 10 s, completed 2016/02/08 1:28:30
プラグインの依存を取得する
reload plugins
でプラグインのプロジェクトに移動した後、ghqGetDependencies
することで addSbtPlugin
したライブラリのソースコードを取得できる。reload return
で元のプロジェクトに復帰。
sbt Reference Manual — Plugins に書いてあるけど偶然発見できたという感じだった。知らなかった……。