Scala 2.13とDottyの互換やクロスビルドについて

0
Kenji Yoshida @xuwei_k

blog書いた xuwei-k.hatenablog.com/entry/2020/07/… "Scala 2.13.4からのTASTy読み取り機能"

2020-07-16 12:46:28
Taisuke OE @OE_uia

予告されてたTASTy Readerが2.13.4に入るみたいでよかった。 これで「理論上は」Scala 2/3のクロスビルドが必要なくなるはず。(実際試したら、必要になるようなコーナーケースが見つかるかもしれないけど) twitter.com/xuwei_k/status…

2020-07-16 14:00:40
Taisuke OE @OE_uia

すでに分かってる非互換性について、解説されてるスレはここ。 特にmacroとかは、Scala 3でビルドされたライブラリ側が、Scala 2.13用のmacroを重複してもたなきゃいけないっぽい? (まあそんな感じにはなるよなぁ・・・) contributors.scala-lang.org/t/roadmap-for-…

2020-07-16 14:15:06
Taisuke OE @OE_uia

ただまだ2.13対応してないメジャーなプロダクトが、Scala 3リリース時にちゃんと(?)Scala 2.13.4以上にできるのか、みたいな不安材料はある。 でないと結局Scala 2.12のサポートが引き続き必要になり、Scala 3移行のしんどさがあがる&進まない、とかにつながるかも

2020-07-16 14:17:05
Taro L. Saito @taroleo

@OE_uia Scala 3 と2.xのクロスビルドができればましなのですが。同一プロジェクト内のモジュール間で、Scala 3と2.13を混ぜて使えないので、既に詰んでいて、プロジェクト構造を大幅に変えるか、sbtを進化させないと使えないです。

2020-07-16 14:29:51
Taisuke OE @OE_uia

@taroleo 「詰んでる」と仰ってる状況をちゃんと理解できてないかも。特にScala 3と2.13について、モジュール間で混ぜたいのはどういった文脈ですか。 3と2.13のクロスビルドは不可能ではなくとも、現実的にはいたるところに非互換性あって大量のscala-2.13ソースが発生しそうですね… github.com/scalacenter/sc…

2020-07-16 14:44:21
Taro L. Saito @taroleo

@OE_uia マルチモジュールプロジェクトA (Scala 2 macro 使用)とB depends on A, C depends on A, B などがあって、AをScala 3マクロに対応させるのは当然なのですが、sbt内で AはScala 3, B, CはScala 2というビルドがまずできない。なので、A, B, Cを同時にScala 3対応する必要にせまられる

2020-07-16 14:47:51
Taro L. Saito @taroleo

@OE_uia これを逆にして、B, Cを先にScala3に対応させることとして、Scala 2.13でビルドされたAをB, CからTastyを有効にして参照したいが、そういう設定が今のsbtでできそうにない。

2020-07-16 14:49:37
Taro L. Saito @taroleo

@OE_uia build.sbtをScala 2系と、Scala 3系で完全に分けて、2種類用意するか、環境変数などでbuild.sbtの挙動を切り替えるようにすれば乗り越えられる気もしますが。

2020-07-16 14:53:03
Taisuke OE @OE_uia

@taroleo ご説明ありがとうございます。 件のTASTy Readerのスレ見る限りAに2.13 compat macroを入れてScala 3ビルドして、それにB,Cが依存して2.13ビルドできることを目指してるのかなと。 AのScala3ビルドがpublishされればできそうに読めますが、sbtのproject dependency経由だと確かにできなそうですね…

2020-07-16 14:58:42
Taro L. Saito @taroleo

環境変数でbuild.sbtの内容を切り替えるのが現実的な気がしてきた

2020-07-16 14:58:55
Taro L. Saito @taroleo

@OE_uia はい。Aを2.13かDotty用にpublishしないと、Aに依存しているB, CがDotty用に開発できないのは一緒かな、と。AをDottyだけにして、B, CはScala 2.13のままという選択肢は増えてるのは嬉しいかもしれませんが、sbtのモジュール間でまだその選択肢が使えない

2020-07-16 15:05:28
Taisuke OE @OE_uia

@taroleo ちゃんと確かめてはいませんが github.com/scala/scala/bl… 見る限りscalacのclasspathに直接TASTy渡せるようなので、少なくともAのTAStyをexternalDependencyClasspathにもってくれば、publishしたものに依存するのと同じようには扱えるはず、とはちょっと思いました

2020-07-16 15:28:10
Taisuke OE @OE_uia

@taroleo もしくはsbt-crossprojectにPlatform足すか、 github.com/sbt/sbt-projec… とかはどうでしょうか

2020-07-16 15:32:12
Taisuke OE @OE_uia

@taroleo projectmatrixのScalaVersionAxis使えず、独自WeakAxisでPartialScala3、Scala2_13みたいなのを定義して scalaVersion := myAxis.value match { case PartialScala3 => "0.25-RC2" // A。Bなら2.13.4 case Scala2_13 => "2.13.4" } みたいなtweakが必要になりそう(かつ未検証)で微妙かもですが

2020-07-16 15:41:14
Kenji Yoshida @xuwei_k

このまえ、ここで話していた問題が解決(or 緩和)されるということかな togetter.com/li/1560202 github.com/sbt/sbt/pull/5…

2020-08-17 12:40:46