【问题标题】:Plugin compilation using wrong Scala version使用错误的 Scala 版本编译插件
【发布时间】:2021-04-01 21:32:53
【问题描述】:

我正在从 Scala 2.13 升级 -> 2.13。

经过多次更改后,我的项目从 IntelliJ 编译,但由于我的一项升级更改(Stream -> LazyList),sbt 在启动时失败(在启动任何任务之前)并出现编译错误。

我的 build.sbt 文件引用了 Scala 2.13.12,但似乎在启动 sbt 时,一些插件源文件正在针对 Scala 2.12 进行编译。

谁能建议如何控制编译这些插件源文件的 Scala 版本?

【问题讨论】:

    标签: scala sbt


    【解决方案1】:

    关键是要了解 sbt 正确构建和 sbt meta 构建项目之间的区别。从概念上讲,它们可以被视为两个不同的 Scala 项目,它们各自的 Scala 版本可能不同。例如,考虑以下实验:

    从模板创建项目:

    ➜  stackoverflow sbt new scala/scala-seed.g8
    [info] welcome to sbt 1.4.7 (AdoptOpenJDK Java 1.8.0_275)
    [info] loading settings for project global-plugins from idea.sbt,plugins.sbt ...
    [info] loading global plugins from /Users/mario_galic/.sbt/1.0/plugins
    [info] set current project to stackoverflow (in build file:/Users/mario_galic/code/stackoverflow/)
    [info] set current project to stackoverflow (in build file:/Users/mario_galic/code/stackoverflow/)
    
    A minimal Scala project.
    
    name [Scala Seed Project]: proper-build-vs-meta-build-scala-version
    
    Template applied in /Users/mario_galic/code/stackoverflow/./proper-build-vs-meta-build-scala-version
    

    现在为元构建创建一个build.sbt 文件

    ➜  stackoverflow cd proper-build-vs-meta-build-scala-version
    ➜  proper-build-vs-meta-build-scala-version echo 'name := "meta-build-project"' > project/build.sbt
    

    现在检查正确构建的名称和 Scala 版本

    ➜  proper-build-vs-meta-build-scala-version sbt
    ...
    sbt:proper-build-vs-meta-build-scala-version> show name
    [info] proper-build-vs-meta-build-scala-version
    sbt:proper-build-vs-meta-build-scala-version> show scalaVersion
    [info] 2.13.4
    

    现在比较元构建的名称和 Scala 版本

    sbt:proper-build-vs-meta-build-scala-version> reload plugins
    ...
    sbt:meta-build-project> show name
    [info] meta-build-project
    sbt:meta-build-project> show scalaVersion
    [info] 2.12.12
    

    注意 meta-build 是一个独立的项目,有自己的 scala 版本。该项目的目的是构建您正确的项目。我们说 sbt 是递归的

    因此,将正确的项目迁移到 Scala 2.13,不会影响作为元构建一部分的 sbt 插件的 Scala 版本。

    【讨论】:

    • 元项目是否也负责编译任何本地构建(即非导入)的插件?我相信这是正在发生的事情,因为 sbt 本身在增量编译阶段失败了。
    • @TerryDactyl 实际上,您本地定制的 sbt 插件以及下载的 sbt 插件必须使用相同的 scala 版本的元项目。
    • 那么 - 我将从哪个文件控制 scala 版本?
    • @TereyDactyl project/build.sbt
    • 感谢你们的帮助。似乎相关文件位于项目下但未被项目使用,但它也在其他地方使用,因此使用元构建和正确构建版本(2.12 和 2.13)进行编译。问题现已解决。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-12
    • 2020-02-14
    • 2013-12-21
    • 1970-01-01
    • 2014-08-13
    • 1970-01-01
    相关资源
    最近更新 更多