$shibayu36->blog;

株式会社はてなでエンジニアをしています。プログラミングや読書のことなどについて書いています。

自作のScalaライブラリをpublishLocalしながら手元でリリース前に最終確認する

joda-time-fakeを作りながら、リリースする前に手元で最終確認したいと思い、やり方を調べていた。調べてみると、publishLocalというものを使えば、ローカルのivy repositoryに成果物をpublishすることができ、そうすることで他のプロジェクトから参照できるようになるようだ。これを使えば手元で最終確認できる。

自分のライブラリをpublishLocalする

https://www.scala-sbt.org/1.x/docs/Publishing.html#Publishing+LocallysbtでpublishLocalしたjarを取り込んで開発サイクルを回す - Qiita にやり方が書いてあった。

まず自分のライブラリのプロジェクトでsbtを起動し、publishLocalする。

$ sbt
sbt:joda-time-fake> +publishLocal
[info] Setting Scala version to 2.12.4 on 1 projects.
[info] Reapplying settings...
[info] Set current project to joda-time-fake (in build file:/Users/shibayu36/development/src/github.com/shibayu36/joda-time-fake-scala/)
[info] Packaging /Users/shibayu36/development/src/github.com/shibayu36/joda-time-fake-scala/target/scala-2.12/joda-time-fake_2.12-0.0.3-SNAPSHOT-sources.jar ...
[info] Updating ...
[info] Done packaging.
[info] Wrote /Users/shibayu36/development/src/github.com/shibayu36/joda-time-fake-scala/target/scala-2.12/joda-time-fake_2.12-0.0.3-SNAPSHOT.pom
[info] Done updating.
[info] Main Scala API documentation to /Users/shibayu36/development/src/github.com/shibayu36/joda-time-fake-scala/target/scala-2.12/api...
[info] Compiling 1 Scala source to /Users/shibayu36/development/src/github.com/shibayu36/joda-time-fake-scala/target/scala-2.12/classes ...
model contains 7 documentable templates
[info] Main Scala API documentation successful.
[info] Packaging /Users/shibayu36/development/src/github.com/shibayu36/joda-time-fake-scala/target/scala-2.12/joda-time-fake_2.12-0.0.3-SNAPSHOT-javadoc.jar ...
[info] Done packaging.
[info] Done compiling.
[info] Packaging /Users/shibayu36/development/src/github.com/shibayu36/joda-time-fake-scala/target/scala-2.12/joda-time-fake_2.12-0.0.3-SNAPSHOT.jar ...
[info] Done packaging.
[info] :: delivering :: com.github.shibayu36#joda-time-fake_2.12;0.0.3-SNAPSHOT :: 0.0.3-SNAPSHOT :: integration :: Sun Mar 25 10:00:36 JST 2018
[info]  delivering ivy file to /Users/shibayu36/development/src/github.com/shibayu36/joda-time-fake-scala/target/scala-2.12/ivy-0.0.3-SNAPSHOT.xml
[info]  published joda-time-fake_2.12 to /Users/shibayu36/.ivy2/local/com.github.shibayu36/joda-time-fake_2.12/0.0.3-SNAPSHOT/poms/joda-time-fake_2.12.pom
[info]  published joda-time-fake_2.12 to /Users/shibayu36/.ivy2/local/com.github.shibayu36/joda-time-fake_2.12/0.0.3-SNAPSHOT/jars/joda-time-fake_2.12.jar
[info]  published joda-time-fake_2.12 to /Users/shibayu36/.ivy2/local/com.github.shibayu36/joda-time-fake_2.12/0.0.3-SNAPSHOT/srcs/joda-time-fake_2.12-sources.jar
[info]  published joda-time-fake_2.12 to /Users/shibayu36/.ivy2/local/com.github.shibayu36/joda-time-fake_2.12/0.0.3-SNAPSHOT/docs/joda-time-fake_2.12-javadoc.jar
[info]  published ivy to /Users/shibayu36/.ivy2/local/com.github.shibayu36/joda-time-fake_2.12/0.0.3-SNAPSHOT/ivys/ivy.xml
[success] Total time: 2 s, completed Mar 25, 2018 10:00:36 AM

これにより、手元のivy repositoryにpublishできた。ログを見ていると、~/.ivy2/localがivy repositoryとして機能するようだ。実際に確認してみると

$ ls ~/.ivy2/local/com.github.shibayu36/
joda-time-fake_2.11 joda-time-fake_2.12
$ ls ~/.ivy2/local/com.github.shibayu36/joda-time-fake_2.11
0.0.3-SNAPSHOT
$ tree ~/.ivy2/local/com.github.shibayu36/joda-time-fake_2.11/0.0.3-SNAPSHOT
/Users/shibayu36/.ivy2/local/com.github.shibayu36/joda-time-fake_2.11/0.0.3-SNAPSHOT
├── docs
│   ├── joda-time-fake_2.11-javadoc.jar
│   ├── joda-time-fake_2.11-javadoc.jar.md5
│   └── joda-time-fake_2.11-javadoc.jar.sha1
├── ivys
│   ├── ivy.xml
│   ├── ivy.xml.md5
│   └── ivy.xml.sha1
├── jars
│   ├── joda-time-fake_2.11.jar
│   ├── joda-time-fake_2.11.jar.md5
│   └── joda-time-fake_2.11.jar.sha1
├── poms
│   ├── joda-time-fake_2.11.pom
│   ├── joda-time-fake_2.11.pom.md5
│   └── joda-time-fake_2.11.pom.sha1
└── srcs
    ├── joda-time-fake_2.11-sources.jar
    ├── joda-time-fake_2.11-sources.jar.md5
    └── joda-time-fake_2.11-sources.jar.sha1

のようにjarファイルやjavadocなどが作られていることが分かる。

ローカルのレポジトリのライブラリを利用する

あとは別プロジェクトでbuild.sbtのlibraryDependenciesに追加すると、ローカルのレポジトリの内容を見てくれる。

build.sbtに追加

libraryDependencies ++= Seq(
  "com.github.shibayu36" %% "joda-time-fake" % "0.0.3-SNAPSHOT"
)

こんな感じのテストファイルを用意する。

import com.github.shibayu36.jodatimefake.FakeTimer
import org.joda.time.DateTime

object FakeTimerExample {
  def main(args: Array[String]): Unit = {
    FakeTimer.fake(1515974400000L) {
      println(DateTime.now.toString)
    }
    FakeTimer.fakeWithTimer(1515974400000L) { t =>

    }
    println(DateTime.now.toString)
  }
}

実行して確認。

$ sbt
> runMain FakeTimerExample
[info] Running FakeTimerExample
2018-01-15T09:00:00.000+09:00
2018-03-25T10:09:26.493+09:00
[success] Total time: 0 s, completed Mar 25, 2018 10:09:26 AM

これでいろいろ確認することが出来た。

versionにはSNAPSHOTのpostfixをつけよう

https://www.scala-sbt.org/1.x/docs/Publishing.html#Publishing+Locallyに書いてあるとおりなのだけど、SNAPSHOTのpostfixがついていないとキャッシュが使われてpublishLocalした内容が使われなかったりする。そのため、0.0.3-SNAPSHOTのようにSNAPSHOTのpostfixをつけるようにしたほうが良さそうであった。

まとめ

今回は自作のScalaライブラリをリリースする前に確認するため、publishLocalを使った方法について試してメモしてみた。これで実際に別プロジェクトからうまく使えるかや、scaladocの表示などを確認できるようになって良かった。

また今回のことを調べた時についでにsbtが依存管理につかっているivyについて調べたので、それについてはまた別の機会にブログで公開しようと思う。