CircleCIにおけるキャッシュの仕組みというか仕様は、他のCIサービスと比べると、少し変わった特徴がある気がします。
といっても、自分は他にはTravisCIくらいしか詳しくないので、実はCircleCIのように色々工夫している方がむしろ最近は主流な可能性もありますが、そこは本題ではないし、詳しくもなく話せないので話しません。
続きを読むCircleCIにおけるキャッシュの仕組みというか仕様は、他のCIサービスと比べると、少し変わった特徴がある気がします。
といっても、自分は他にはTravisCIくらいしか詳しくないので、実はCircleCIのように色々工夫している方がむしろ最近は主流な可能性もありますが、そこは本題ではないし、詳しくもなく話せないので話しません。
続きを読むいきなり本題というか、一番言いたいことを書くと、まず
テストの fork の設定によってぜんぜん違う。
という点があまり知られていない気がします。 *1
というか、自分も今回調べるまで、微妙に古い知識のままで完璧に知らなかったので、今一度理解した現時点での詳細を今書いています。
sbtにおいて、テストがどう並列化されるか?に関して、関係するというか、今回話すのは、以下の点です
また、今から話すのはsbt 1.3.8時点の情報です。
さらに前提として、マシンのCPUのコア数によって挙動が異なる可能性がありますが、ひとまずそれなりに十分にコア数がある、として話を進めます。(少なくとも4以上) *2
*1:もちろん公式ドキュメントには書いてあるのでそれは読みましょうというか、完璧に読んだことある人は、このblog読む必要ないはずです https://www.scala-sbt.org/1.x/docs/Testing.html
*2:specs2などは、更に別の概念として、1つのテストclass内のテスト並列実行する機能があったはずですが、今回はsbt自体の機能の話なので、そこには触れません
というのを作りました。
scalapbというのは、scala向けのprotocol buffersやgRPCのためのライブラリですが、protobufのmessageに対応するcase classのコンパニオンオブジェクトのapplyには、すべて(protobuf上のデフォルト値と同様の)デフォルト引数が設定されています。
これは便利なときもあるのですが、意図せず使ってしまってバグることも多いので、以前自分がpull reqして、デフォルト引数がないファクトリーメソッドを別途追加したことがありました。
つまりデフォルト引数によるミスを防ぎたい場合は、こっちの "of" を使えばいいです。 そして、ofに書き換える箇所を探すのにあたって、大量にあって探しづらいのでwartremoverでwarnかerrorにしてくれるものを作りました。
(wartremoverには、デフォルト引数の"定義"を警告するやつはあるけど、使用側はない?どちらにしろ、他のやつは許容して、scalapbのやつだけ警告したかったので作った)
本当はscalafixで自動書き換え作りたかったのですが、そんなにすぐに作れる能力がなかったので、誰か作って・・・。
以下のような質問を某所で受けたので
書きました
既にあるとか、もっといい感じに書ける、みたいなのがあればお知らせください。
ちなみに、デフォルトでは単体のprojectしかcleanしないのは、完全にsbt的には意図した挙動のはずです。 デフォルトが今回自分が書いたような挙動では、逆に特定の単体のprojectだけをcleanしようとすると手段がなくて困るので。とはいえ、その手段が提供されていればデフォルトのcleanの挙動がそっちでも困らない?といえるかもしれませんが。
> もっといい感じに書ける、みたいなのがあればお知らせください。
— Taisuke OE (@OE_uia) 2020年6月14日
自力でloopしなくても、classpathTransitiveRefsを使えば同じことできそうです。
val ref = thisProjectRef.value
(ref +: buildDependencies.value.classpathTransitiveRefs(ref)).map(_ / clean).joinhttps://t.co/6DPyQ5nS0I
要点をまとめると
みたいな感じなんですが、とりあえずもう答を貼っておきます。すでに誰か作っていそうな気もするので、そしたら教えて下さい
"sub projectの列挙を全自動で" は(自分にとっては)とても重要で、なぜかというと、仕事でこれ必要になったんですが、仕事のprojectはmonorepoでsbtのprojectが、このblog書いてる時点で81個あるので(今後も増える可能性あり)、明示的に列挙なんて絶対にやりたくない、という理由です。