sbtでunidocを自動でsonatypeにpublishする

まずsbt-unidoc https://github.com/sbt/sbt-unidoc というsbt pluginの簡単な説明。(以下の説明は、現時点で最新の0.3.0という前提です)

  • sbtでサブモジュールを分けた場合、標準ではそれぞれ個別のScaladocしか作れない
  • sbt-unidocは、すべてのモジュールをまとめたScaladocを作るためのplugin

で、sbt-unidocの最低限の使い方としては、READMEの通りに
1. plugin.sbtにaddSbtPluginで依存加える
2. rootのプロジェクトの設定に unidocSettings を追加*1

して、"unidoc" と打つだけで、全部がまとまったScaladocが生成されます。その他色々機能があるので、あとはREADME読んでください。

さて、unidoc生成しても、それをどこかに置かないと意味がありません。置く場所の選択肢としてはgithub pageとか、色々あるわけですが、以前書いたこれ

sonatypeに特定のURLでアクセスすると、javadocやscaladocを展開して表示してくれる機能がある件

があるので、とりあえずunidocもsonatypeにpublishしておけば便利なのでは?
と思って、rootのプロジェクトから、publishSignedした際に、unidocも全部同時にpublishできるように設定を頑張ってみたら、数行足すだけでできました。

必要な部分だけ抜粋すると以下

  import sbtunidoc.Plugin._

  val root = Project("root", file(".")).settings(
     name := "この名前でpublishされるので、nameは適切に設定したほうがよい",
     unidocSettings ++ Seq(
        artifacts <<= Classpaths.artifactDefs(Seq(packageDoc in Compile)),
        packagedArtifacts <<= Classpaths.packaged(Seq(packageDoc in Compile))
      ) ++ Defaults.packageTaskSettings(
        packageDoc in Compile, (UnidocKeys.unidoc in Compile).map{_.flatMap(Path.allSubpaths)}
      ): _*
    ).aggregate(その他のprojectの依存)

実際にコンパイル通る例と、生成後の例は以下のリンク先見てください。(sbt0.13.2で動作確認)

https://github.com/xuwei-k/httpz/blob/2361c8388e40206e25cbc79e3cfa9c3ae7b85239/project/Build.scala#L175-L184
https://oss.sonatype.org/service/local/repositories/releases/archive/com/github/xuwei-k/httpz-all_2.10/0.2.9/httpz-all_2.10-0.2.9-javadoc.jar/!/index.html


こうやって一度設定してしまえば、*2勝手にunidoc publishされるようになるので、面倒でないしおすすめです。sbtでライブラリをsonatypeにpublishしてる人は是非やってみましょう。
以前書いたけれど、sbt-releaseやsbt-sonatypeを組み合わせると 

sbt-sonatypeとsbt-release pluginを組み合わせて使うサンプル - scalaとか・・・

更に便利です

*1:importも必要ですよ

*2:変なバグにあたらない限り