我有一个由SBT管理的Scala项目,具有以下源文件夹结构:
src
|-main
| |-scala
| |-scala-2
| |-scala-3 文件夹
scala包含在Scala 2和Scala 3中编译的代码。scala-2包含特定于Scala 2的代码。scala-3包含特定于Scala 3的代码。SBT很好地处理了这三个文件夹,从Scala 2切换到Scala 3,测试都很好,甚至还可以为Scala 2和3释放JAR。
但是,我使用IntelliJ进行开发,并且无法让它在两个并发Scala版本中很好地工作。例如,它将处理文件夹scala和scala-2,但忽略scala-3。这意味着我所有的IntelliJ特性(如代码检查、自动完成等)都可以用于第一个文件夹,而不是第三个文件夹。
如何正确配置IntelliJ以处理不同的Scala版本和源代码?
我在用:
发布于 2022-11-07 10:40:47
最好的方法是禁用IntelliJ中的一些项目,并且只启用当前要处理的项目。例如,如果我只想处理与sbt-投影矩阵 (和sbt-命令矩阵)交叉编译的项目的JVV2.13:
// project/plugins.sbt
addSbtPlugin("com.eed3si9n" % "sbt-projectmatrix" % "0.9.0")
addSbtPlugin("com.indoorvivants" % "sbt-commandmatrix" % "0.0.5")
addSbtPlugin("org.scala-js" % "sbt-scalajs" % "1.11.0")
addSbtPlugin("org.scala-native" % "sbt-scala-native" % "0.4.7")
addSbtPlugin("org.jetbrains" % "sbt-ide-settings" % "1.1.0")// build.sbt
val scala2_13version = "2.13.10"
val scala3version = "3.2.0"
// which version I want to use in my project
val ideScala = scala2_13version
Global / excludeLintKeys += ideSkipProject
val only1JvmScalaInIde = MatrixAction
.ForPlatforms(VirtualAxis.jvm)
.Configure(_.settings(ideSkipProject := (scalaVersion.value != ideScala)))
val noJsNoNativeInIde = MatrixAction
.ForPlatforms(VirtualAxis.js, VirtualAxis.native)
.Configure(_.settings(ideSkipProject := true))
val example = projectMatrix
.in(file("example"))
.someVariations(
List(scala2_13version, scala3version),
List(VirtualAxis.jvm, VirtualAxis.js, VirtualAxis.native)
)(only1JvmScalaInIde, noJsNoNativeInIde)
.settings(
// ...
)
val root = project
.in(file("."))
.aggregate(example.projectRefs: _*)最关键的是
ideSkipProject := true您将申请所有您不希望IntelliJ导入的项目(键来自addSbtPlugin("org.jetbrains" % "sbt-ide-settings" % "1.1.0")插件)。您可以调整它以适应您正在使用的任何其他交叉编译解决方案。
就我个人而言,我使用上面的工作流,将ideScala设置为2.13或3,每次只使用一个版本,并在需要切换时编辑它并重新加载sbt。虽然这些项目没有导入到IntelliJ中,但是sbt仍然可以看到并构建所有这些项目。
https://stackoverflow.com/questions/74340971
复制相似问题