如何为Scala项目同步Intellij和sbt构建

8

我有一个sbt项目,已经导入到Intellij中。有时我会在命令行中使用sbt构建项目,然后当我需要调试时,我会从Intellij中构建它。然而,每次我切换时,都需要进行完整的重新构建,而实际上并不需要。两种构建过程都输出到相同的类文件夹,即.../target/scala-2.11/classes,所以我不明白为什么会一直进行完整的重新构建?

2个回答

6
根据CrazyCoder所述,Intellij和sbt build各自跟踪已更改文件以进行增量构建。因此,每次重新编译文件时,另一个会将其视为已更改的文件并重新编译它。
虽然CrazyCoder的答案描述了如何通过更改sbt编译的类目录使它们在不同的目录中工作,但本答案解释了如何配置Intellij以使用sbt进行所有构建,因此只有sbt进行编译。这是一个相对较新的功能。
只需勾选该选项即可:
file
  > Settings
    > Build, Execution, Deployment
      > Build Tools
        > SBT 
          > Use SBT shell for build and import

它至少在Intellij版本2017.2.3中起作用,很可能是SBT插件的一个选项。有关此功能的详细信息,请参见JetBrains票证:https://youtrack.jetbrains.com/issue/SCL-10984

5
IntelliJ IDEA 无法重用其他构建系统生成的类,因为它有自己的增量编译器,可以在编译过程中跟踪依赖关系并构建缓存,以便在您更改代码时仅编译修改和相关文件。当您使用 SBT/Maven/Gradle 或命令行 javac 构建时,IntelliJ IDEA 编译器缓存不知道发生了什么变化以及应该编译哪些文件,因此它执行完整的重建。

解决方案是为 IDE 和 SBT 使用不同的输出目录,这样 IntelliJ IDEA 将仅重新构建自上次 IDE 构建以来已修改的文件,而您的命令行 SBT 构建将不会触发 IDE 中的重建。

可以使用 sbt-ide-settings 插件进行此配置。

将以下内容添加到 plugins.sbt 中(或者您配置插件的任何文件中):

resolvers += Resolver.url("jetbrains-bintray",url("http://dl.bintray.com/jetbrains/sbt-plugins/"))(Resolver.ivyStylePatterns)
addSbtPlugin("org.jetbrains" % "sbt-ide-settings" % "0.1.2")

以下是如何在build.sbt中自定义IDE输出目录的方法:

ideOutputDirectory in Compile := Some(new File("target/idea/classes"))
ideOutputDirectory in Test := Some(new File("target/idea/test-classes"))

根据您的需求随意更改路径。


IntelliJ配置是从SBT导入的(我猜是使用SBT插件)。下一次刷新后,它不会开始使用新的目标目录吗? - Juh_
这个不起作用,因为测试输出目录被忽略了。所以当你尝试运行代码时,会出现一个错误:“生产和测试输出路径在...中共享”(我使用的是Intellij 2017 3.3)。 - gbasler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接