実際に仕事で役立っている自作のScala関連OSSツールまとめ

仕事以外でも役立ってるものも多く含んでいますが、仕事きっかけで作ったか、OSSに対して使っていても仕事でもよく使ってる自作ツールについていくつか振り返って紹介してみる記事。

振り返ってみるだけなので、自分のblogやtwitterをかなりしっかり読んでる珍しい人(?)にとっては、そんなに新しい情報はないと思います。

個人的には、当然OSSでわりと普通のライブラリも作っているし貢献もしていますが、普通のライブラリは似たような分野のものを既に使っていたらよほどの理由がない限り簡単には切り替えたりしないし、似たような依存を2つ同時に入れることは普通ないと思うので、今回は普通のライブラリというよりは若干方向性が異なるツール的なものやsbt pluginを中心に紹介します。

単に仕事というよりは、規模が一定以上だったり、CIのコスト削減や速度改善だったりといった、普通にOSSやってるだけではそこまで頑張らない方向性のものが必要になって出来上がる、というのが興味深かったというか、良かったポイントです。

大まかには、よく使っている順というか、作って(コスパなどが)良かったなぁ〜、と思った順で並べています。

1. https://xuwei-k.github.io/scalameta-ast/ scalametaのTree表示することによるscalafixの雛形生成ツール

何度か書いていますが、ここ数年は簡単な使い捨てを含むと、平均するとおそらく1日1回以上のペースでscalafixのruleを書いています。 個人的にscalafixを頑張り出したのが数年前?なので、すると1000個以上は書いてると思います。

よって、scalafixのruleを出来るだけ素早く書くためには、Treeをpattern matchで分解する部分がまず面倒というか、どうなっているか?を知らないと書けないわけですが、それを補助するためのツールです。

それ以外の細かい機能もありますが。

scala-jsで作ってありブラウザだけで動いてserverもローカルでの環境も何も必要ないので、そういう点ではGitHub Pagesに置いておくだけで運用は気にしなくてよくてとても便利です。

xuwei-k.hatenablog.com

2. https://github.com/xuwei-k/scalafix-rules 自作のscalafixのrule集

最近、scalafix慣れ過ぎて必要な時に一瞬で書けるようになってきたので、あまり新しいものを追加してないですが、ある程度汎用的なものから、とりあえず作ったものまで、色々と置いてあります。

よく使ってるルールは割と一部ですが。 解説は以前書いた以下を参照。

xuwei-k.hatenablog.com

xuwei-k.hatenablog.com

xuwei-k.hatenablog.com

3. https://github.com/wartremover/wartremover

これはScala 2部分に関しての大半は他の人が元々作ったものですが、Scala 3対応やその後の新規ルール追加含めたメンテは、ここ数年は9割以上自分が実施しているので、含めておきました。

https://xuwei-k.github.io/slides/wartremover-3/

例えば以下の2つあたりは、うまく使うと本当に絶妙なバグっぽいものが見つかるし、wartremoverのような形式の型を見るlinterではないと書けないものなので、とても便利に使っています。

xuwei-k.hatenablog.com

xuwei-k.hatenablog.com

また、scalafixでもそうですが、それぞれのproject内特有のlinterを書いて入れて使っている(OSSにしてない)場合もあります。

4. https://github.com/xuwei-k/sbt-warning-diff CIで警告のdiff表示するsbt plugin

細かい不満点というか改善したい点もありますが、少なくとも現状Scala界隈で似たようなツールの存在を知らないし、導入が面倒なのですが、うまく使えばかなり効果が高いと思っているので、ぜひ使って欲しいものですね。

scalafixやwartremoverの独自の警告まで合わせて表示されるし、Scala 3でのreviewdogのための機能も含んでいます。

xuwei-k.hatenablog.com

xuwei-k.hatenablog.com

5. https://github.com/xuwei-k/unused-code プロジェクト内部の使ってないコード検知して削除するplugin

一定上大きいプロジェクトになると、使ってないコードをうまく探して検知するのは、思ったより難しいというか奥が深いというか、意識してないと結構残ってることが多いと思います。

今後も使わないコードを残しておいても無駄にcompileやtestのコストがかかるだけなので、本当に使わないなら早めに消すのは地味だけど大抵メリットしかないはずです。

おそらくJavaくらいIDEが賢いとIDEで大体検知できるかもしれません。 ScalaIntelliJ IDEAでも割と最近は賢くなったので、結構検知してくれますが、誤検知もあるし、まだこのblog書いてる時点でも、この自作のツールが役立つ場面は経験上多少あります。

xuwei-k.hatenablog.com

6. https://github.com/xuwei-k/mima

これかなり大昔に作ったし、conscriptというほぼ廃れたもの前提で作ってあるなどで多分全然知られてないと思いますが、個人的には今でも定期的に使っていますね。

バイナリ互換検知するための以下のようなScala界隈でデファクトで使われているツールがあり

github.com

それをコマンドから一発で起動できるようにしてあるツールです。

むしろ、(別にこの自作のツールでなくてもいいですが)みんな結局ライブラリのupdateするときにバイナリ互換しっかりチェックしないでどうやってるんだろう???最終的にはテストその他で担保するしかないとはいえ、こういうツールでjarを分析するのがまず最初にやるべきでは???と昔から思っています。

7. https://github.com/xuwei-k/test-times-reporter

1回作って、頑張って最適化した後は、そんなに結果の傾向変わらないというかやること増えないので、すごく役立ってる感は薄れてきたのでこの順位になっていますが、CIのテスト時間頑張って最適化するなら、こういうことしてしっかり計測するのは、絶対に重要だと思います。

xuwei-k.hatenablog.com

関連して、これ書いた時点ではしっかりしたOSSにしてないですが、これもちゃんとgithubに置きたい気がしているが、細かい部分色々考えると面倒だったりでやっていない・・・

xuwei-k.hatenablog.com

8. protoの未使用messageなどを見つけるplugin

厳密にいうと「importだけ頑張るもの」と「その他のmessageやrpcやenum検知して削除するもの」と、2つ作ってそれぞれ地味に使っています。

ScalaPB使ったプロジェクトかつ、コードもScalaやsbt前提、という結構限られた条件ですが、scalametaとprotocのpluginの仕組み使ったものとしては好例というか面白いものに仕上がってると思います(?)

https://github.com/xuwei-k/proto-unused-imports

https://github.com/xuwei-k/unused-proto

xuwei-k.hatenablog.com

まとめ?

今後もこういうの作っていきたいですね